- 方式1
dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
NSLog(@"dispatch-1");
});
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
NSLog(@"dspatch-2");
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
NSLog(@"end");
});
因为是异步并发执行,所以dispatch-1,dspatch-2,顺序是不固定的,但是end肯定是在dispatch-1,dspatch-2,都执行完成之后才执行
- 方式2
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
NSLog(@"1111");
NSLog(@"2222");
dispatch_group_leave(group);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"3333");
});
- 方式3
// 因为 dispatch_group_wait 会阻塞线程,所以创建一个新的线程,用来完成任务
// 同时用异步的方式向新线程(tasksQueue)中添加任务
dispatch_queue_t tasksQueue = dispatch_queue_create("tasksQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(tasksQueue, ^{
// 真正用来完成任务的线程
dispatch_queue_t performTasksQueue = dispatch_queue_create("performTasksQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < 3; i++) {
// 入组之后的 block 会被 group 监听
// 注意:dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
dispatch_group_enter(group);
dispatch_async(performTasksQueue, ^{
NSLog(@"开始第 %zd 项任务", i);
[NSThread sleepForTimeInterval:(3 - i)];
dispatch_group_leave(group);
NSLog(@"完成第 %zd 项任务", i);
});
}
//dispatch_group_wait会阻塞主线程,所以在异步并发的子线程里用
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"全部任务完成");
});
});
网友评论