生词表
1.dispatch 调度
2. queue 队列
3. sync 同步
4. async 异步
5. DISPATCH_QUEUE_CONCURRENT 并发
6. DISPATCH_QUEUE_SERIAL 串行
使用场景
在实际开发中,需要开启N个异步线程,但是后续操作,需要依赖N个线程返回的数据,需要接收所有线程任务执行完成的通知。
常规用法
/**
调度组-在一组异步代码执行完毕后,统一获得通知
*/
- (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. 监听所有任务完成
dispatch_group_notify(group, q, ^{
NSLog(@"OVER %@", [NSThread currentThread]);
});
// 5. 判断异步
NSLog(@"come here");
}
注:dispatch_group_notify这个函数是异步的,如果要换成同步用dispatch_group_wait(group, DISPATCH_TIME_FOREVER).群组不空,这句代码一直等,下面代码不执行
enter & leavel
dispatch_group_enter(group)函数内部实现原理
终端输入:**man dispatch_group_enter **
连续两个空格
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)函数
- 必须和dispatch_group_enter(group)成对出现
- 必须在block的最后一句
特殊场景下用法
- (void)group2 {
// 队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 调度组
dispatch_group_t group = dispatch_group_create();
// 1. 进入群组,给 group 打一个标记,在后续紧接着的 block 归 group 监听
// dispatch_group_enter 和 dispatch_group_leave 必须成对出现!
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");
}
注:同样最后等待群组的通知,也可以换成异步的,,参考常规写法用例
- 待补充。。。