最近在項(xiàng)目中有一需求:假設(shè)有三個(gè)異步請(qǐng)求A幅狮、B能岩、C寞宫,等這三個(gè)異步請(qǐng)求完成之后,通知程序執(zhí)行D方法拉鹃,但又不要阻塞線程辈赋!貌似面試的時(shí)候面試官也喜歡問這種問題,第一反應(yīng)是用GCD處理膏燕,之前也看過一些GCD資料钥屈,但是沒有實(shí)際操作過,今天網(wǎng)上又看了下GCD的資料坝辫,找到了簡(jiǎn)單的解決辦法篷就!
用最簡(jiǎn)單的辦法去解決復(fù)雜的問題!=Α竭业!
附以下代碼:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/**創(chuàng)建dispatch組*/
dispatch_group_t group = dispatch_group_create();
for (NSInteger i = 0; i < 10; i++) {
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
/**此處是異步請(qǐng)求*/
[WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
dispatch_group_leave(group);
}];
});
}
/**為group設(shè)置通知一個(gè)block,當(dāng)group關(guān)聯(lián)的block執(zhí)行完畢后及舍,就調(diào)用這個(gè)block*/
dispatch_group_notify(group, queue, ^{
NSLog(@"It's doneN戳尽!锯玛!");
});
PS: 手動(dòng)管理group關(guān)聯(lián)的block的運(yùn)行狀態(tài)(或計(jì)數(shù))咐柜,進(jìn)入和退出group次數(shù)必須匹配
dispatch_group_enter(group);
dispatch_group_leave(group);
之前看GCD相關(guān)內(nèi)容,將想要執(zhí)行的代碼寫入下面block塊中:
dispatch_group_async(group, queue, ^{
/**此處寫要執(zhí)行的代碼*/
});
說是和調(diào)用dispatch_group_enter(group); dispatch_group_leave(group);
等價(jià)的攘残,經(jīng)測(cè)試拙友,其實(shí)不等價(jià),dispatch_group_async里面只好執(zhí)行同步的方法歼郭,如果是異步的請(qǐng)求献宫,并不會(huì)等請(qǐng)求返回結(jié)果后再通知dispatch_group_notify進(jìn)行處理!
信號(hào)量處理異步請(qǐng)求
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_group_async(group, queue, ^{
[WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_async(group, queue, ^{
[WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_notify(group, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});