AFNetworking多圖上傳

workspace_2-wallpaper-2560x1440.jpg
/**
 *  上傳多張圖片
 *
 *  @param imageList image數(shù)組
 *  @param block     block, 返回上傳的圖片數(shù)組
 */
+ (void)uploadTaskImages:(NSArray <UIImage *>*)imageList completeBlock:(void(^)(NSArray *imageNameList, BOOL succ))block;
+ (void)uploadTaskImages:(NSArray <UIImage *>*)imageList completeBlock:(void(^)(NSArray *imageNameList, BOOL succ))block {
    NSMutableArray* resultImageList = [NSMutableArray array];
    for (int i = 0; i < imageList.count; i++) {
//創(chuàng)建一個(gè)數(shù)組, 初始值復(fù)制NSNull進(jìn)行占位.
        [resultImageList addObject:[NSNull null]];
    }
    dispatch_group_t taskGroup = dispatch_group_create();
    dispatch_queue_t serialQueue = dispatch_queue_create("com.jason.gcd", DISPATCH_QUEUE_SERIAL);
//    dispatch_set_target_queue(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), serialQueue);
  //多次提交上傳代碼的方法, imageList.count參數(shù)表示提交的次數(shù)
    dispatch_apply(imageList.count, serialQueue, ^(size_t index) {
        dispatch_group_enter(taskGroup);
//--------------------------上傳的圖片的方法, 此處只需換成自己工程中上傳的方法極即可----------------------------
        [QSMApiTool uploadImg:imageList[index] result:^(NSError *error, id result, BOOL isFromCache, AFHTTPRequestOperation *operation) {
            if (error) {
                AppLog(@"第 -------%d-------- 張圖片上傳失敗: error = %@", (int)index + 1, error);
                dispatch_group_leave(taskGroup);
                block(imageList, NO);
            } else {
                AppLog(@"第 -------%d--------- 張圖片上傳成功: 圖片地址 = %@", (int)index + 1, result);
                @synchronized (resultImageList) {
                    resultImageList[index] = result;
                }
                dispatch_group_leave(taskGroup);
            }
        }];
//--------------------------------------------------------
    });
    dispatch_group_notify(taskGroup, serialQueue, ^{
        //此處要回到主線程
        dispatch_async(dispatch_get_main_queue(), ^{
            block(resultImageList, YES);
        });
    });
}
  1. 首先dispatch_group_t taskGroup = dispatch_group_create()
    創(chuàng)建一個(gè)任務(wù)組,在任務(wù)組里面多次提交上傳圖的請求.
  2. 需要注意的是, 由于上傳圖片是異步的, dispatch_group_enter()顯式的指明一個(gè)任務(wù)執(zhí)行塊進(jìn)入了這個(gè)組,dispatch_group_leave()顯式表明執(zhí)行塊執(zhí)行完畢,移除出組。這樣才能保證所有的圖片上傳完成之后才會(huì)進(jìn)dispatch_group_notify,否則只要有一個(gè)成功就會(huì)走dispatch_group_notify,顯然這不是我們需要的結(jié)果.
  3. dispatch_group_notify里面要執(zhí)行回到主線程的方法. 否則刷新UI會(huì)失敗.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

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

  • 在這兩部分的系列中,第一個(gè)部分的將解釋 GCD 是做什么的,并從許多基本的 GCD 函數(shù)中找出幾個(gè)來展示。在第二部...
    透支未來閱讀 411評論 0 1
  • 目錄:iOS多線程(一)--pthread、NSThreadiOS多線程(二)--GCD詳解iOS多線程(三)--...
    Claire_wu閱讀 1,136評論 0 6
  • GCD筆記 總結(jié)一下多線程部分,最強(qiáng)大的無疑是GCD,那么先從這一塊部分講起. Dispatch Queue的種類...
    jins_1990閱讀 834評論 0 1
  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 948評論 0 3
  • 2017年的立春那天,cheer老師的水彩畫課程正式開課,那天是預(yù)熱課,認(rèn)真的做好筆記,就等著材料的到來。 昨天晚...
    豬媽成長記閱讀 479評論 0 1

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