GCD:
使用Dispatch Group追加block到Global Group Queue,這些block如果全部執(zhí)行完畢,就會(huì)執(zhí)行Main Dispatch Queue中的結(jié)束處理的block。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加載圖片1 / });
dispatch_group_async(group, queue, ^{ /加載圖片2 / });
dispatch_group_async(group, queue, ^{ /加載圖片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并圖片
});
需要注意的:dispatch_group_wait是同步的所以不能放在主線程執(zhí)行。
補(bǔ)充: dispatch_group會(huì)等和它關(guān)聯(lián)的所有的dispatch_queue_t上的任務(wù)都執(zhí)行完畢才會(huì)發(fā)出同步信號(dispathc_group_notify的代碼塊block會(huì)被執(zhí)行,group_wait會(huì)結(jié)束等待)。也就是說一個(gè)group可以關(guān)聯(lián)多個(gè)任務(wù)隊(duì)列;下面給出示例:
- (void)groupSync2
{
dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
sleep(5);
NSLog(@"任務(wù)一完成");
});
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
sleep(6);
NSLog(@"任務(wù)二完成");
});
dispatch_group_async(dispatchGroup, globalQueue, ^{
sleep(10);
NSLog(@"任務(wù)三完成");
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
NSLog(@"notify:任務(wù)都完成了");
});
}
NSOperation:
// 創(chuàng)建隊(duì)列
NSOperationQueue *queue1 = [[NSOperationQueue alloc] init];
// 添加操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"download1----%@", [NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"download2----%@", [NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"download3----%@", [NSThread currentThread]);
}];
// 設(shè)置依賴(保證op3在op1和op2都執(zhí)行完之后再執(zhí)行)
[op3 addDependency:op1];
[op3 addDependency:op2];
[op1 start];
[op2 start];
[op3 start];