原文地址: http://blog.csdn.net/qq_31810357/article/details/78906308 未經許可,嚴禁轉載!
GCD使用 dispatch_group_notify
、dispatch_group_enter
、dispatch_group_leave
處理多線程同步操作
一、簡介
dispatch_group_enter:通知group,下面的任務馬上要放到group中執行。
dispatch_group_leave:通知group,任務完成了,該任務要從group中移除。
通常兩者穿插於任務中;
二、測試
- (void)syncActionTest
{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
//模擬多線程耗時操作
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"%@----Block1結束",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@----1結束",[NSThread currentThread]);
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"%@----Block2結束",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@----2結束",[NSThread currentThread]);
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@---全部結束",[NSThread currentThread]);
});
});
}
三、應用
常見如 : 多圖片上傳, 在上傳完所有圖片後將imgUrl數組上傳到服務器
dispatch_group_t group = dispatch_group_create();
__weak DespritionViewController *weakSelf = self;
for (UIImage *image in self.arrDataSources) {
dispatch_group_enter(group);
[ZDUserHttpRequest uploadImage:image andType:@"1" completion:^(NSString *picUrl) {
dispatch_group_leave(group);
if (picUrl) {
[weakSelf.picUrlArr addObject:picUrl];
} else {
[SVProgressHUD showErrorWithStatus:@"上傳失敗,請重試"];
}
} failed:^(NSURLSessionDataTask *task, NSError *error) {
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
do something...
});
});