使用場景
我們知道使用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地址戳這里