iOS系统GCD学习(3):dispatch_group
来源:互联网 发布:最优化理论与方法难吗 编辑:程序博客网 时间:2024/05/16 11:20
设想下面的循环:
- for(id obj in array)
- [self doSomethingIntensiveWith:obj];
假定 -doSomethingIntensiveWith: 是线程安全的且可以同时执行多个.一个array通常包含多个元素,这样的话,我们可以很简单地使用GCD来平行运算:
- dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- for(id obj in array)
- dispatch_async(queue, ^{
- [self doSomethingIntensiveWith:obj];
- });
如此简单,我们已经在多核心上运行这段代码了。
当然这段代码并不完美。有时候我们有一段代码要像这样操作一个数组,但是在操作完成后,我们还需要对操作结果进行其他操作:
- for(id obj in array)
- [self doSomethingIntensiveWith:obj];
- [self doSomethingWith:array];
这时候使用GCD的 dispatch_async 就悲剧了.我们还不能简单地使用dispatch_sync来解决这个问题, 因为这将导致每个迭代器阻塞,就完全破坏了平行计算。
解决这个问题的一种方法是使用dispatch group。一个dispatch group可以用来将多个block组成一组以监测这些Block全部完成或者等待全部完成时发出的消息。使用函数dispatch_group_create来创建,然后使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组。所以我们现在可以重新代码:
- dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- dispatch_group_t group = dispatch_group_create();
- for(id obj in array)
- dispatch_group_async(group, queue, ^{
- [self doSomethingIntensiveWith:obj];
- });
- dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
- dispatch_release(group);
[self doSomethingWith:array];如果这些工作可以异步执行,那么我们可以更风骚一点,将函数-doSomethingWith:放在后台执行。我们使用dispatch_group_async函数建立一个block在组完成后执行:
- dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- dispatch_group_t group = dispatch_group_create();
- for(id obj in array)
- dispatch_group_async(group, queue, ^{
- [self doSomethingIntensiveWith:obj];
- });
- //等group里的task都执行完后执行notify方法里的内容,相当于把wait方法及之后要执行的代码合到一起了
- dispatch_group_notify(group, queue, ^{
- [self doSomethingWith:array];
- });
dispatch_release(group);不仅所有数组元素都会被平行操作,后续的操作也会异步执行,并且这些异步运算都会将程序的其他部分考虑在内。注意如果-doSomethingWith:需要在主线程中执行,比如操作GUI,那么我们只要将main queue而非全局队列传给dispatch_group_notify函数就行了。
还有一段演示dispatch_group的代码:
- dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- dispatch_group_t group = dispatch_group_create();
- dispatch_group_async(group, queue, ^{
- [NSThread sleepForTimeInterval:1];
- NSLog(@"group1");
- });
- dispatch_group_async(group, queue, ^{
- [NSThread sleepForTimeInterval:2];
- NSLog(@"group2");
- });
- dispatch_group_async(group, queue, ^{
- [NSThread sleepForTimeInterval:3];
- NSLog(@"group3");
- });
- dispatch_group_notify(group, dispatch_get_main_queue(), ^{
- NSLog(@"updateUi");
- });
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(3):dispatch_group
- GCD 学习(四) dispatch_group
- GCD 学习(四) dispatch_group
- iOS开发之GCD -- dispatch_group
- iOS GCD 之dispatch_group方面的开发
- iOS之GCD再谈(dispatch_group,dispatch_semaphore)
- GCD(dispatch_group)
- GCD-dispatch_group
- iOS学习笔记74- 完整详解GCD系列(三)dispatch_group
- GCD收录3--dispatch_group线程调度组
- iOS--GCD(使用dispatch_group来进行线程同步)
- GCD(四)dispatch_group
- GCD 第三篇 dispatch_group
- ios 多线程控制线程并发数、GCD之dispatch_group、GCD信号量
- iOS系统GCD学习(1):介绍
- 标题:AMBA、AHB、APB总线简介
- 归并排序求逆序数
- 分布式系统常用思想和技术总结
- 从给小孩买书想到
- svn删除文件出错的经验总结
- iOS系统GCD学习(3):dispatch_group
- 计算结构体成员偏移地址的一种方法
- 泊松分酒问题
- 软件专利申请
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- iOS系统GCD学习(4):dispatch_group2
- 别让灵魂赶不上影子
- 贝尔曼福特算法
- Android去除系统自带动画的两种方法