dispatch_group_t group =dispatch_group_create();dispatch_queue_t queue =dispatch_get_global_queue(0,0);dispatch_group_enter(group);dispatch_async(queue,^{sleep(1);NSLog(@"任務1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue,^{NSLog(@"任務2");dispatch_group_leave(group);});dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"任務3:主線程更新UI");});NSLog(@"任務4:主線程正在執行");
執行程序,結果如下:
任務4:主線程正在執行任務2任務1任務3:主線程更新UI
分析:
dispatch_group 執行任務開始時, 程序由上到下執行任務1、任務2、任務3、任務4;
由于任務4沒有在調度組中,因此優先執行;
然后有兩個調度組異步執行任務1和任務2,最后再通知主線程執行任務3;
由于第一個任務1中線程sleep(1),因此任務2會比任務1優先完成;
最后再通知主線程執行任務3,更新UI。
② 如果將 dispatch_group_notify 移動到最前面,能否執行?執行結果是怎樣的呢?
代碼修改如下:
dispatch_group_t group =dispatch_group_create();dispatch_queue_t queue =dispatch_get_global_queue(0,0);dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"任務3:主線程更新UI");});dispatch_group_enter(group);dispatch_async(queue,^{sleep(1);NSLog(@"任務1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue,^{NSLog(@"任務2");dispatch_group_leave(group);});NSLog(@"任務4:主線程正在執行");
dispatch_group_t group =dispatch_group_create();dispatch_queue_t queue =dispatch_get_global_queue(0,0);dispatch_group_enter(group);dispatch_async(queue,^{sleep(1);NSLog(@"任務1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue,^{NSLog(@"任務2");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"任務3:主線程更新UI");});NSLog(@"任務4:主線程正在執行");
dispatch_group_t group =dispatch_group_create();dispatch_queue_t queue =dispatch_get_global_queue(0,0);dispatch_group_enter(group);dispatch_async(queue,^{sleep(1);NSLog(@"任務1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue,^{NSLog(@"任務2");dispatch_group_leave(group);});dispatch_group_leave(group);dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"任務3:主線程更新UI");});NSLog(@"任務4:主線程正在執行");
執行程序之后,可以看到程序會延遲崩潰在任務1的 dispatch_group_leave(group),這是因為 enter-leave 沒有成對匹配,dispatch_group 沒有 enter 卻需要 leave,導致 value 不等于 dsema_orig 不會執行喚醒邏輯。