GCD處理多線程同步操作 韓俊強的博客

原文地址: http://blog.csdn.net/qq_31810357/article/details/78906308 未經許可,嚴禁轉載!

GCD使用 dispatch_group_notifydispatch_group_enterdispatch_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...
        });
    });

結論:

在開啓了多線程執行任務時,若使用了dispatch_group_notifydispatch_group_enterdispatch_group_leave,也能有效的保證了等所有的子線程任務處理完後,有一個處理最後結果的地方。


iOS開發者交流羣:①446310206 ②446310206

推薦資源:

iOS-Swift-Developers

iOS-OC-Developer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章