JOIN行为
CGD利用dispatch_group_wait来实现多个操作的join行为,代码如下:
1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 2 dispatch_group_t group = dispatch_group_create(); 3 4 dispatch_group_async(group, queue, ^{ 5 sleep(0.5); 6 NSLog(@"1"); 7 }); 8 dispatch_group_async(group, queue, ^{ 9 sleep(1.5); 10 NSLog(@"2"); 11 }); 12 dispatch_group_async(group, queue, ^{ 13 sleep(2.5); 14 NSLog(@"3"); 15 }); 16 17 NSLog(@"aaaaa"); 18 19 dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2ull * NSEC_PER_SEC); 20 if (dispatch_group_wait(group, time) == 0) { 21 NSLog(@"已经全部执行完毕"); 22 } 23 else { 24 NSLog(@"没有执行完毕"); 25 } 26 27 NSLog(@"bbbbb"); |
这里起了3个异步线程放在一个组里,之后通过dispatch_time_t创建了一个超时时间(2秒),程序之后行,立即输出了aaaaa,这是主线程输出的,当遇到dispatch_group_wait时,主线程会被挂起,等待2秒,在等待的过程当中,子线程分别输出了1和2,2秒时间达到后,主线程发现组里的任务并没有全部结束,然后输出了bbbbb。
在这里,如果超时时间设置得比较长(比如5秒),那么会在2.5秒时第三个任务结束后,立即输出bbbbb,也就是说,当组中的任务全部执行完毕时,主线程就不再被阻塞了。
如果希望永久等待下去,时间可以设置为DISPATCH_TIME_FOREVER。
并行循环
类似于C#的PLINQ,OC也可以让循环并行执行,在GCD当中有一个dispatch_apply函数:
1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_apply(20, queue, ^(size_t i) {
3 NSLog(@"%lu", i);
4 });
这段代码让i并行循环了20次,如果内部处理的是一个数组,就可以实现对数组的并行循环了,它的内部是dispatch_sync的同步操作,所以在执行这个循环的过程当中,当前线程会被阻塞。
暂停和恢复
使用dispatch_suspend(queue)可以暂停队列中任务的执行,使用dispatch_result(queue)可以继续执行被暂停的队列。