GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave處理多執行緒同步操作

滴水微瀾發表於2016-12-23

一、簡介

dispatch_group_enter:通知group,下面的任務馬上要放到group中執行了。

dispatch_group_leave:通知group,任務完成了,該任務要從group中移除了。

這兩種通知可以在多執行緒間自由穿梭的。

二、驗證

下面用程式碼驗證下它們的作用。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self syncAction];
}

- (void)syncAction{
    
    dispatch_group_t group =dispatch_group_create();
    dispatch_queue_t globalQueue=dispatch_get_global_queue(0, 0);
    
    
    dispatch_group_enter(group);
    
    //模擬多執行緒耗時操作
    dispatch_group_async(group, globalQueue, ^{
        sleep(3);
        NSLog(@"%@---block1結束。。。",[NSThread currentThread]);
        dispatch_group_leave(group);
    });
    NSLog(@"%@---1結束。。。",[NSThread currentThread]);
    
    dispatch_group_enter(group);
    //模擬多執行緒耗時操作
    dispatch_group_async(group, globalQueue, ^{
        sleep(3);
        NSLog(@"%@---block2結束。。。",[NSThread currentThread]);
        dispatch_group_leave(group);
    });
    NSLog(@"%@---2結束。。。",[NSThread currentThread]);
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%@---全部結束。。。",[NSThread currentThread]);
    });

}

執行app,點選頁面列印的結果如下:

2016-12-23 09:46:27.853 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---1結束。。。
2016-12-23 09:46:27.856 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---2結束。。。
2016-12-23 09:46:30.923 CPMNetworking[1341:36550] <NSThread: 0x608000263f00>{number = 4, name = (null)}---block1結束。。。
2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---block2結束。。。
2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---全部結束。。。

結論:

在開啟了多執行緒執行任務時,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保證了等所有的子執行緒任務處理完後,有一個處理最後結果的地方。

相關文章