假如你說:像這樣的GCD多任務(wù)應(yīng)用的場景不太算多沙峻,
我說:但這不是你沒必要知道怎么去處理使用GCD處理多任務(wù)的事情的理由
其實(shí)在iOS開發(fā)中获枝,像這樣的多任務(wù)處理软瞎,很簡單,因?yàn)锳pple已經(jīng)幫你封裝好了各種好用的API曙咽,比如GCD蛔趴,現(xiàn)在我就說下具體的用法,所有的注釋都在代碼里例朱,寫的應(yīng)該說是很詳細(xì)了孝情。
dispatch_group:創(chuàng)建任務(wù)組,然后異步執(zhí)行加入到group的每個(gè)任務(wù)洒嗤,比如向group添加了3個(gè)任務(wù)箫荡,那么這3個(gè)任務(wù),會(huì)同時(shí)執(zhí)行的渔隶,由于每個(gè)任務(wù)執(zhí)行時(shí)間(耗時(shí))不一樣羔挡,所有在所有的任務(wù)都執(zhí)行結(jié)束后,會(huì)調(diào)用dispatch_group_notify间唉,可以在這里處理多個(gè)任務(wù)的結(jié)果绞灼。
dispatch_group_t group = dispatch_group_create(); // 創(chuàng)建任務(wù)組
dispatch_group_enter(group):創(chuàng)建任務(wù),添加至group中
dispatch_group_leave(group):任務(wù)結(jié)束呈野,離開group
// eg:
dispatch_group_enter(group);
// 創(chuàng)建任務(wù)(代碼)
dispatch_group_leave(group);
需要提醒的一點(diǎn):使用dispatch_group創(chuàng)建的多任務(wù)低矮,enter 和 leave 必須成對(duì)出現(xiàn),否則被冒,就呵呵了~
- (void)testGroupMultitask
{
NSLog(@"testGroupMultitask===============");
// 1.創(chuàng)建任務(wù)組
dispatch_group_t group = dispatch_group_create();
// 2.加入第一個(gè)任務(wù)
dispatch_group_enter(group);
NSMutableString *groupResult = [NSMutableString string];
// 模擬一個(gè)6秒的請(qǐng)求
[self fakeRequestWithDelay:6 result:^(NSString *string, NSError *error) {
/*
在這里我們?cè)O(shè)置的dispatch_group_wait時(shí)間是5秒军掂,但是我們這個(gè)任務(wù)的回調(diào)時(shí)間是6秒。所以結(jié)果是5秒過后wait超時(shí)昨悼,程序繼續(xù)往下執(zhí)行蝗锥,打印-> "wait時(shí)間已經(jīng)到了"。
然而這個(gè)任務(wù)還在線程里執(zhí)行率触,一直到執(zhí)行dispatch_group_leave這個(gè)任務(wù)才完成玛追。
*/
NSString *result = [NSString stringWithFormat:@"任務(wù)組1完成 %@",string];
[groupResult appendString:result];
[groupResult appendString:@"\n"];
NSLog(@"------%@",string);
dispatch_group_leave(group);
}];
// 3.加入第二個(gè)任務(wù)
dispatch_group_enter(group);
/*
這里我發(fā)現(xiàn)一個(gè)問題,我設(shè)置的dispatch_after的延時(shí)時(shí)間是3秒闲延,也就是3秒后把block中的任務(wù)加入線程;
所以結(jié)果應(yīng)該是在dispatch_group_wait時(shí)間內(nèi)就能完成的痊剖,打印順序應(yīng)該是在 "wait時(shí)間已經(jīng)到了" 之前才對(duì), 但是打印的順序卻是先打永萘帷:"wait時(shí)間已經(jīng)到了"陆馁,然后打印:任務(wù)組2完成;
我猜測這個(gè)延時(shí)執(zhí)行的代碼合愈,是異步的等待叮贩,并不是阻塞線程的,
*/
dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC);
dispatch_after(tt, dispatch_get_main_queue(), ^{
NSString *result = @"任務(wù)組2完成 delay 3 seconds";
[groupResult appendString:result];
[groupResult appendString:@"\n"];
NSLog(@"------%@",result);
dispatch_group_leave(group);
});
// 4.加入第三個(gè)任務(wù)
dispatch_group_enter(group);
NSString *result = @"任務(wù)組3完成";
[groupResult appendString:result];
[groupResult appendString:@"\n"];
NSLog(@"------%@",result);
dispatch_group_leave(group);
// 5.執(zhí)行到這句代碼后會(huì)等待5秒佛析,等待關(guān)聯(lián)的任務(wù)組group里的所有任務(wù)完成益老。如果在5秒內(nèi)都完成了,返回0并繼續(xù)執(zhí)行寸莫;如果超時(shí)未完成捺萌,返回非0并繼續(xù)執(zhí)行。所以任務(wù)組里的任務(wù)無論是否全部完成膘茎,都會(huì)繼續(xù)執(zhí)行桃纯。
int waitTime = 5;
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(waitTime*NSEC_PER_SEC)));
NSLog(@"wait時(shí)間已經(jīng)到了 %i seconds",waitTime);
// 6.notify會(huì)簡體關(guān)聯(lián)的任務(wù)組group中的所有任務(wù)是否都已完成(dispatch_group_enter和dispatch_group_leave匹配)乖仇,完成了就會(huì)執(zhí)行block
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"------所有任務(wù)組都完成了 \n %@",groupResult);
});
}
執(zhí)行以上代碼迹蛤,在控制臺(tái)輸出結(jié)果:
2016-07-10 17:53:10.397 | testGroupMultitask===============
2016-07-10 17:53:10.397 | ------任務(wù)組3完成
2016-07-10 17:53:15.399 | wait時(shí)間已經(jīng)到了 5 seconds
2016-07-10 17:53:15.403 | ------任務(wù)組2完成 delay 3 seconds
2016-07-10 17:53:16.986 | ------delay 6 seconds
2016-07-10 17:53:16.987 |
------所有任務(wù)組都完成了
任務(wù)組3完成
任務(wù)組2完成 delay 3 seconds
任務(wù)組1完成 delay 6 seconds
對(duì)照打印的結(jié)果娩嚼,可以看出料身,上面group各任務(wù)的執(zhí)行順序边琉。