日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS:多线程技术GCD的使用

發布時間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS:多线程技术GCD的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GCD的使用:

1.隊列的類型 ? ? ?1.1 主隊列:mian queue,主線程隊列,負責更行UI的操作。是一個串行的隊列。 ? ? ?1.2 系統默認的并行隊列:global queue,按優先級分類。 ? ? ?1.3 自定義的隊列:可以創建串行隊列或者是并行的隊列 ? 2.任務 ? ? ?2.1 封裝的形式:block方法或C語言的函數 ? ? ?2.2 添加到隊列的方式:同步或異步(只對并行隊列有區別) ? ? ? ? ?例如服務器請求: ? ? ? ? ?同步:提交請求->等待服務器處理(這個期間客戶端瀏覽器不能干任何事)->處理完畢返回 ?? ? ? ? ? ?異步:請求通過事件觸發->服務器處理(這個期間客戶端瀏覽器仍可以干其他的事)->處理完畢返回 ? 3.特殊使用 ? ? ?3.1 只執行一次 dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);(多用于單例模式) ? ? ?3.2 延時執行 ? ?dispatch_after(dispatch_time_t?when,dispatch_queue_t??queue,dispatch_block_t block); ? ? ?3.3 成組的執行任務 ? ? ??dispatch_group_create(void); ? ? ?3.4 創建自定義的隊列? ??dispatch_queue_create(const?char?*label,?dispatch_queue_attr_t?attr); ? ? ?3.5 創建默認的全局隊列?dispatch_get_global_queue(long?identifier,?unsigned?long?flags) ? ? ?3.6 獲取主隊列 ? ? ? ? ? ??dispatch_get_main_queue(void) ? ? ?3.7 異步執行 ? ? ? ? ? ? ? ?dispatch_async(dispatch_queue_t?queue,?dispatch_block_t?block); ? ? ?3.8 同步執行 ? ? ? ? ? ? ?dispatch_sync(dispatch_queue_t?queue,?dispatch_block_t?block); ? ? ?3.9 多次執行 ?dispatch_apply(size_t?iterations,?dispatch_queue_t?queue,void (^block)(size_t)); ? ? ?…………………等等…………………

4.幾個方法參數解釋:

<1>創建自定義的隊列? ??dispatch_queue_create(const?char?*label,?dispatch_queue_attr_t?attr);

const?char?*label:隊列名字 ?? ? ? ? ? ? ? ? ?dispatch_queue_attr_t?attr:隊列執行方式(串行、并行)

<2>創建默認的全局隊列?dispatch_get_global_queue(long?identifier,?unsigned?long?flags)

long?identifier:隊列執行的優先級 ? ? ? ? ??unsigned?long?flags:默認為0即可

<3>多次執行 ? ? ? ??dispatch_apply(size_t?iterations,?dispatch_queue_t?queue,void?(^block)(size_t));

size_t?iterations:執行次數 ? ? ?dispatch_queue_t?queue:隊列 ? ? ?void?(^block)(size_t):block函數塊

? 5.隊列方式宏定義(用于創建自定義隊列時的參數)

#define DISPATCH_QUEUE_SERIAL NULL ? ? ? ? //串行

#define DISPATCH_QUEUE_CONCURRENT ? ? ? ?//并行

?

6.隊列優先級宏定義(創建全局隊列時的參數)

#define DISPATCH_QUEUE_PRIORITY_HIGH?2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT?0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

?

7.更能區分

主隊列:專門用來執行主線程的,進行UI的更新操作

全局隊列或自定義隊列:用來添加并執行其他的線程,進行數據的操作

?

?具體舉例如下:

例子1:采用不分組的方式,將多線程添加到隊列中,然后進行多線程的操作。

1.準備UI界面布局:拖入一個文本視圖控件,并關聯相關的類中,同時在類中聲明一個票數變量

@interface ViewController () {NSInteger _tickets; } @property (weak, nonatomic) IBOutlet UITextView *textView; @end

2.設置票數,同時將原來文本視圖中默認的數據清空,取消自動布局便于后面添加數據時自動滾動文本視圖

//設置數據和文本視圖_tickets = 20;[self.textView setText:@""];self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.創建全局隊列,并設置優先級,設置并行方式

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

4.用GCD創建任務線程,并將線程添加到隊列中,采用異步執行方式

dispatch_async(queue, ^{[self GCDSellTicketMethod:@"GCD售票線程-1"];});dispatch_async(queue, ^{[self GCDSellTicketMethod:@"GCD售票線程-2"];});

5.定義更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text {//1.獲取原來的數據NSMutableString *content = [NSMutableString stringWithString:self.textView.text];NSRange range = NSMakeRange(content.length, 2);//2.追加新的內容[content appendString:[NSString stringWithFormat:@"\n%@",text]];[self.textView setText:content];//3.滾動視圖 [self.textView scrollRangeToVisible:range]; }

6.定義任務線程的執行方法

#pragma mark -執行線程的操作

-(void)GCDSellTicketMethod:(NSString *)name {while (YES){if(_tickets > 0){//使用GCDdispatch_async(dispatch_get_main_queue(), ^{//更新UINSString *info = [NSString stringWithFormat:@"總票數:%ld,當前的線程:%@",_tickets,name];[self appendTextView:info];//賣票_tickets--;});//線程休眠if([name isEqualToString:@"GCD售票線程-1"]){[NSThread sleepForTimeInterval:0.3f];}else{[NSThread sleepForTimeInterval:0.2f];}}else{//使用GCD更新UIdispatch_async(dispatch_get_main_queue(), ^{NSString *info = [NSString stringWithFormat:@"票已經賣完,當前線程:%@",name];[self appendTextView:info];});//退出線程break;}} }

?

例子2:采用分組的方式,將線程組添加到隊列中,然后進行多線程的操作。

1.準備UI界面布局:拖入一個文本視圖控件,并關聯相關的類中,同時在類中聲明一個票數變量

@interface ViewController () {NSInteger _tickets; } @property (weak, nonatomic) IBOutlet UITextView *textView; @end

2.設置票數,同時將原來文本視圖中默認的數據清空,取消自動布局便于后面添加數據時自動滾動文本視圖

//設置數據和文本視圖_tickets = 20;[self.textView setText:@""];self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.創建一個線程分組

dispatch_group_t group = dispatch_group_create();

4.創建自定義的隊列,并設置隊列執行方式為并行方式

??dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

5.用GCD創建任務線程組,并將線程組添加到隊列中,采用分組異步執行方式

? dispatch_group_async(group,queue, ^{

? ? ? [self GCDSellTicketMethod:@"GCD售票線程-1"];

? });? ?

? dispatch_group_async(group,queue, ^{

? ? ? [self GCDSellTicketMethod:@"GCD售票線程-2"];

? });

6.等線程組中的所有任務完成后,會接收到通知,更新UI

dispatch_group_notify(group, queue, ^{dispatch_async(dispatch_get_main_queue(), ^{NSString *info = [NSString stringWithFormat:@"票已經賣完"];[self appendTextView:info];});});

7.定義更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text {//1.獲取原來的數據NSMutableString *content = [NSMutableString stringWithString:self.textView.text];NSRange range = NSMakeRange(content.length, 2);//2.追加新的內容[content appendString:[NSString stringWithFormat:@"\n%@",text]];[self.textView setText:content];//3.滾動視圖[self.textView scrollRangeToVisible:range]; }

8.定義任務線程的執行方法

#pragma mark -執行線程的操作

-(void)GCDSellTicketMethod:(NSString *)name {while (YES){if(_tickets > 0){//使用GCDdispatch_async(dispatch_get_main_queue(), ^{//更新UINSString *info = [NSString stringWithFormat:@"總票數:%ld,當前的線程:%@",_tickets,name];[self appendTextView:info];//賣票_tickets--;});//線程休眠if([name isEqualToString:@"GCD售票線程-1"]){[NSThread sleepForTimeInterval:0.3f];}else{[NSThread sleepForTimeInterval:0.2f];}}else{ //退出線程break;}} }

?

兩種情況的演示結果如下:

?

?

?

?

?

?

?

程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式! 分類:?iOS高級
本文轉自當天真遇到現實博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/4859089.html,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的iOS:多线程技术GCD的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。