生詞表
1.dispatch 調度
2. queue 隊列
3. sync 同步
4. async 異步
5. DISPATCH_QUEUE_CONCURRENT 并發(fā)
6. DISPATCH_QUEUE_SERIAL 串行
使用場景
在實際開發(fā)中,需要開啟N個異步線程,但是后續(xù)操作,需要依賴N個線程返回的數(shù)據(jù),需要接收所有線程任務執(zhí)行完成的通知焦读。
常規(guī)用法
/**
調度組-在一組異步代碼執(zhí)行完畢后子库,統(tǒng)一獲得通知
*/
- (void)group1 {
// 1. 調度組
dispatch_group_t group = dispatch_group_create();
// 2. 隊列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 3. 將任務添加到隊列和調度組
dispatch_group_async(group, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"任務 1 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"任務 2 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"任務 3 %@", [NSThread currentThread]);
});
// 4. 監(jiān)聽所有任務完成
dispatch_group_notify(group, q, ^{
NSLog(@"OVER %@", [NSThread currentThread]);
});
// 5. 判斷異步
NSLog(@"come here");
}
注:dispatch_group_notify這個函數(shù)是異步的,如果要換成同步用dispatch_group_wait(group, DISPATCH_TIME_FOREVER).群組不空矗晃,這句代碼一直等仑嗅,下面代碼不執(zhí)行
enter & leavel
dispatch_group_enter(group)函數(shù)內(nèi)部實現(xiàn)原理
終端輸入:**man dispatch_group_enter **
連續(xù)兩個空格
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_retain(group);
dispatch_group_enter(group);
dispatch_async(queue, ^{
block();
dispatch_group_leave(group);
dispatch_release(group);
});
}
dispatch_group_leave(group)函數(shù)
- 必須和dispatch_group_enter(group)成對出現(xiàn)
- 必須在block的最后一句
特殊場景下用法
- (void)group2 {
// 隊列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 調度組
dispatch_group_t group = dispatch_group_create();
// 1. 進入群組,給 group 打一個標記张症,在后續(xù)緊接著的 block 歸 group 監(jiān)聽
// dispatch_group_enter 和 dispatch_group_leave 必須成對出現(xiàn)仓技!
dispatch_group_enter(group);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:10];
NSLog(@"download A - %@", [NSThread currentThread]);
// 耗時操作代碼
// 2. 離開群組
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download B - %@", [NSThread currentThread]);
// 耗時操作代碼
// 2. 離開群組
dispatch_group_leave(group);
});
// 等待群組空,一直到永遠俗他,群組不空脖捻,這句代碼就死等,同步
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"OK");
}
注:同樣最后等待群組的通知兆衅,也可以換成異步的地沮,,參考常規(guī)寫法用例
- 待補充羡亩。摩疑。。