iOS开发之GCD使用总结

发表于:2014-7-31 10:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:肉排君    来源:51Testing软件测试网采编

  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)可以继续执行被暂停的队列。
33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号