
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);
});
});
}
- 首先
dispatch_group_t taskGroup = dispatch_group_create()
創(chuàng)建一個(gè)任務(wù)組,在任務(wù)組里面多次提交上傳圖的請求. - 需要注意的是, 由于上傳圖片是異步的,
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é)果. - 在
dispatch_group_notify里面要執(zhí)行回到主線程的方法. 否則刷新UI會(huì)失敗.