GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave處理多線程同步操作


一、簡介

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,也能有效的保證了等所有的子線程任務處理完后,有一個處理最后結果的地方。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM