-
dispatch_group中都是同步事件情况
例如任务3需要在任务1和任务2执行结束以后(任务1.2是并发执行的)再执行, 代码如下:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"任务1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"任务2");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"任务3");
});
- dispatch_group中有异步任务
> 下面是Swift代码, 可以对照OC互相转换
```swift
let queue = DispatchQueue.main // 拿到主队列
let group = DispatchGroup() // 创建队列组
group.enter() // 标志着任务1加入组
queue.async (group: group) {
// 任务1, 闭包的回调是在子线程
self.task1() { () in
print("任务1回调完成")
group.leave() // 标志着任务1回调完成
}
}
group.enter() // 标志着任务2加入组
queue.async (group: group) {
self.task2() { () in
print("任务2回调完成")
group.leave() // 标志着任务2回调完成
}
}
group.notify(queue: DispatchQueue.main) {
print("任务1.2都回调完成")
}
其实同步的时候, 系统会自动在任务前加上
group.enter()
, 在任务后加上group.leave()
, 成对的加, 当所有成对的group.enter()
&&group.leave()
执行完了, 系统再调用notify
. 所以group中有异步任务时只需要自己显式地加上这对代码就可以了. 注意:这里的任务1&&任务2是并发执行的. 如果需要串行可以用到dispatch_semaphore
, 信号量.
网友评论