如何同步若干個(gè)異步調(diào)用?(如根據(jù)若干個(gè)url異步加載多張圖片,然后在都下載完成后合成一張整圖)

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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 952評論 0 3
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 693評論 0 0
  • 歡迎大家指出文章中需要改正或者需要補(bǔ)充的地方,我會(huì)及時(shí)更新,非常感謝。 一. 多線程基礎(chǔ) 1. 進(jìn)程 進(jìn)程是指在系...
    xx_cc閱讀 7,380評論 11 70
  • 1. GCD簡介 什么是GCD呢?我們先來看看百度百科的解釋簡單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 503評論 0 0
  • 項(xiàng)目需要做一個(gè)下拉框,根據(jù)選擇內(nèi)容的不同,加載不同的視圖,在安卓開發(fā)工具里有現(xiàn)成的工具 spinner,直接拿來用...
    我叫山雞_閱讀 569評論 2 2

友情鏈接更多精彩內(nèi)容