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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于GCD多任务处理

發布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于GCD多任务处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假如你說:像這樣的 GCD 多任務應用的場景不太算多, 我說:但這不是你沒必要知道怎么去處理使用GCD處理多任務的事情的理由

其實在 iOS 開發中,像這樣的多任務處理,很簡單,因為 Apple 已經幫你封裝好了各種好用的 API,比如 GCD,現在我就說下具體的用法,所有的注釋都在代碼里,寫的應該說是很詳細了。

dispatch_group:創建任務組,然后異步執行加入到 group 的每個任務,比如向 group 添加了3個任務,那么這3個任務,會同時執行的,由于每個任務執行時間(耗時)不一樣,所有在所有的任務都執行結束后,會調用 dispatch_group_notify,可以在這里處理多個任務的結果。

dispatch_group_t group = dispatch_group_create(); // 創建任務組 dispatch_group_enter(group):// 創建任務,添加至 group dispatch_group_leave(group):// 任務結束,離開 group

// eg: dispatch_group_enter(group); // 創建任務(代碼) ... dispatch_group_leave(group); 復制代碼

需要提醒的一點:使用dispatch_group創建的多任務,enter 和 leave 必須成對出現,否則,就呵呵了~

- (void)testGroupMultitask {NSLog(@"testGroupMultitask===============");// 1.創建任務組dispatch_group_t group = dispatch_group_create();// 2.加入第一個任務dispatch_group_enter(group);NSMutableString *groupResult = [NSMutableString string];// 模擬一個6秒的請求[self fakeRequestWithDelay:6 result:^(NSString *string, NSError *error) {/*在這里我們設置的dispatch_group_wait時間是5秒,但是我們這個任務的回調時間是6秒。所以結果是5秒過后wait超時,程序繼續往下執行,打印-> "wait時間已經到了"。然而這個任務還在線程里執行,一直到執行dispatch_group_leave這個任務才完成。*/NSString *result = [NSString stringWithFormat:@"任務組1完成 %@",string];[groupResult appendString:result];[groupResult appendString:@"\n"];NSLog(@"------%@",string);dispatch_group_leave(group);}];// 3.加入第二個任務dispatch_group_enter(group);/*這里我發現一個問題,我設置的dispatch_after的延時時間是3秒,也就是3秒后把block中的任務加入線程;所以結果應該是在dispatch_group_wait時間內就能完成的,打印順序應該是在 "wait時間已經到了" 之前才對, 但是打印的順序卻是先打印:"wait時間已經到了",然后打印:任務組2完成;我猜測這個延時執行的代碼,是異步的等待,并不是阻塞線程的,*/dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC);dispatch_after(tt, dispatch_get_main_queue(), ^{NSString *result = @"任務組2完成 delay 3 seconds";[groupResult appendString:result];[groupResult appendString:@"\n"];NSLog(@"------%@",result);dispatch_group_leave(group);});// 4.加入第三個任務dispatch_group_enter(group);NSString *result = @"任務組3完成";[groupResult appendString:result];[groupResult appendString:@"\n"];NSLog(@"------%@",result);dispatch_group_leave(group);// 5.執行到這句代碼后會等待5秒,等待關聯的任務組group里的所有任務完成。如果在5秒內都完成了,返回0并繼續執行;如果超時未完成,返回非0并繼續執行。所以任務組里的任務無論是否全部完成,都會繼續執行。int waitTime = 5;dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(waitTime*NSEC_PER_SEC)));NSLog(@"wait時間已經到了 %i seconds",waitTime);// 6.notify會簡體關聯的任務組group中的所有任務是否都已完成(dispatch_group_enter和dispatch_group_leave匹配),完成了就會執行blockdispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"------所有任務組都完成了 \n %@",groupResult);}); } 復制代碼

執行以上代碼,在控制臺輸出結果:

2016-07-10 17:53:10.397 | testGroupMultitask=============== 2016-07-10 17:53:10.397 | ------任務組3完成 2016-07-10 17:53:15.399 | wait時間已經到了 5 seconds 2016-07-10 17:53:15.403 | ------任務組2完成 delay 3 seconds 2016-07-10 17:53:16.986 | ------delay 6 seconds 2016-07-10 17:53:16.987 | ------所有任務組都完成了 任務組3完成 任務組2完成 delay 3 seconds 任務組1完成 delay 6 seconds 復制代碼

對照打印的結果,可以看出,上面group各任務的執行順序。

最后再說下,enter和leave,不成對的后果:就是這個缺少leave的任務,在開辟的子線程里一直在等待結束,所以 dispatch_group_notify 一直收不到所有任務完成的通知

轉載于:https://juejin.im/post/5c8c7e175188257e9044f263

總結

以上是生活随笔為你收集整理的关于GCD多任务处理的全部內容,希望文章能夠幫你解決所遇到的問題。

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