使用dispatch group實現(xiàn)多圖異步上傳功能

使用場景

我們知道使用AFNetworking進(jìn)行網(wǎng)絡(luò)請求,都是異步的,有時候我們需要等若干個無序的(2個或者更多個)異步請求都成功后再執(zhí)行某些代碼(比如demo里實現(xiàn)的多圖上傳功能),當(dāng)遇到這種需求的時候,最簡單的做法,或者說我們一般會采用的做法是,將一個異步請求嵌套在另一個異步請求中,就是在第一個請求成功返回后再調(diào)用第2個異步請求,這種做法其實是不太好的,既浪費了時間(因為完全可以多個異步請求同時發(fā)出),而且寫出來的代碼還很臟(2個異步請求還好,如果再多,呵呵,那畫面自己想)。

如何使用dispatch group來實現(xiàn)上述場景中的需求

1.創(chuàng)建dispatch_group_t

  dispatch_group_t group = dispatch_group_create();

2.使用dispatch_group_enter進(jìn)入group,表示任務(wù)開始

  dispatch_group_enter(group);

3.使用dispatch_group_leave退出group,表示任務(wù)完成

  dispatch_group_leave(group);

4.使用dispatch_group_notify注冊group里所有任務(wù)完成后的回調(diào)block

  dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [self doSomethingWhenAllImageUpload:error];
  });

注:與dispatch_group_notify對應(yīng)的還有一個叫dispatch_group_wait的東西,這2者的區(qū)別是:

dispatch_group_notify:是異步的,不阻塞當(dāng)前線程
dispatch_group_wait:會阻塞當(dāng)前線程,直到dispatch group中所有任務(wù)都完成才返回

完整的調(diào)用代碼:

  dispatch_group_t group = dispatch_group_create();
    
    __block BOOL error = NO;
    
    [self.uploadImageArray enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL * _Nonnull stop) {
        
        dispatch_group_enter(group);
        [[AFFileClient sharedClient] upload:@"app/upload_file/imageList"
                                 parameters:nil
                                      files:@{@"upload":UIImageJPEGRepresentation(image, 0.8)}
                                   complete:^(ResponseData *response) {
                                       dispatch_group_leave(group);
                                       if (response.success) {
                                           NSLog(@"第%@張圖片上傳完成...",@(idx));
                                       }
                                       else {
                                           error = YES;
                                           NSLog(@"第%@張圖片上傳失敗:%@",@(idx),response.message);
                                       }
        }];
    }];
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [self doSomethingWhenAllImageUpload:error];
    });

執(zhí)行效果(異步回調(diào)順序)

screenshot2.png

說明

如有不足,歡迎指正,我會感激不盡!

完整demo地址戳這里

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

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

  • 同步/異步 同步:多個任務(wù)情況下,一個任務(wù)A執(zhí)行結(jié)束,才可以執(zhí)行另一個任務(wù)B。只存在一個線程也就是主線程。 異步:...
    XLsn0w閱讀 335評論 0 0
  • 一、簡單介紹下將會用到的一些東西 英語不好就不翻譯官方文檔了.. 1、dispatch_group_async S...
    Albert新榮閱讀 1,819評論 0 1
  • Managing Units of Work(管理工作單位) 調(diào)度塊允許您直接配置隊列中各個工作單元的屬性。它們還...
    edison0428閱讀 8,217評論 0 1
  • 生活中有許多狂喜, 但有一種狂喜,只有喝酒的人才懂。 那是知而不能言的,只覺得胸膽開張, 天地如此接近,即便手舞足...
    Tina在鄭州閱讀 359評論 0 0
  • 寶寶:媽媽,你要減肥了,站著你都看不到腳尖了! 媽媽:我可以站在鏡子前面看呀。 寶寶:哎呀,胖了以后會生病的,我長...
    藥藥炎炎閱讀 616評論 0 51

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