关于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多任务处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn安装和使用
- 下一篇: leetcode_486. Predic