写高质量OC代码52建议总结:44.通过Dispatch Group机制,根据系统资源状况来执行任务
2017-07-25 17:19
691 查看
dispatch group能够把任务分组。等待这组任务执行完毕,在回调函数中继续往下执行。比如,可以把压缩一系列文件的任务表示成dispatch group:
这个函数用于等待dispatch group执行完毕:
如果想要数组中每个对象都执行某项任务,并且想等待所有任务执行完毕,可以使用GCD这个特性完成。
为了执行队列中的块,GCD会在适当的时机自动创建新线程或者复用旧线程。通过dispatch group所提供的这种简便方式,可以并发执行一系列给定的任务,又可以在全部任务结束时得到通知。
上面,遍历某个collection,令其每个元素上执行任务,这也可以用另一个GCD来实现:
总结:
1.一系列任务可以归纳进dispatch group中,这组任务执行完成时获得回调通知。
2.用dispatch group,可以在并发队列中同时执行多项任务,GCD会根据系统资源状况来调度这些并发任务。
dispatch_group_tdispatch_group_create();有两种方法给任务编组。
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);这个方法是dispatch_async的变体。另一种办法是:
void dispatch_group_enter(dispatch_group_t group); void dispatch_group_leave(dispatch_group+t group);前者可以使分组中正要执行的任务数递增,后者递减。所以,调用了dispatch_group_enter,只有必须对应一个dispatch_group_leave,如果只有enter没有leave,这个任务永远执行不玩。
这个函数用于等待dispatch group执行完毕:
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);如果执行dispatch group的时间小于timeout,返回0,否则返回非0值。timeout参数也可以取常量DISPATCH_TIME_FOREVER,会一直等dispatch group执行完,不会超时。
void dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);与wait函数略有不同。可以向此函数传入块,等dispatch group函数执行完,块会在特定线程上执行。当当前线程不应阻塞,又想在任务全部完成时得到通知,可以这样做。
如果想要数组中每个对象都执行某项任务,并且想等待所有任务执行完毕,可以使用GCD这个特性完成。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t dispatchGroup = dispatch_group_create(); for (id object in collection ) { dispatch_group_async(dispatchGroup, queue, ^{ [object performTask]; }); } dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER);如果当前线程不应阻塞,可以用notify函数替代wait:
dispatch_queue_t notifyQueue = dispatch_get_main_queue(); idspatch_group_notify(dispatchGroup, notifyQueue, ^{ // ........ });notify回调所选的队列,完全应该根据具体情况定。在本例中,所有任务都派发到同一个任务中,实际上没必要。可以把一部分任务分派到优先级高的线程上。
dispatch_queue_t lowPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); dispatch_group_t dispatchGroup = dispatch_group_create(); for (id object in lowPriorityObjects) { dispatch_group_async(dispatchGroup, lowPriorityQueue, ^{ [object performTask]; }); } for (id object in highPriorityObjects) { dispatch_group_async(dispatchGroup, highPriorityQueue, ^{ [object performTask]; }); } dispatch_queue_t notifyQueue = dispatch_get_main_queue(); dispatch_group_notify(dispatchGroup, notifyQueue, ^{ //......... });另一种情况,将任务交给各个串行队列中,用dispatch group监控其执行状况。
dispatch_queue_t queue = dispatch_queue_create("com.effectiveobjectec.queue", NULL); for (id object in collection) { dispatch_async(queue, ^{ [object performTask]; }); } dispatch_async(queue, ^{ //...... });未必总要使用dispatch group,有时采用单个队列搭配标准的已不派发,实现效果相同。
为了执行队列中的块,GCD会在适当的时机自动创建新线程或者复用旧线程。通过dispatch group所提供的这种简便方式,可以并发执行一系列给定的任务,又可以在全部任务结束时得到通知。
上面,遍历某个collection,令其每个元素上执行任务,这也可以用另一个GCD来实现:
void dispatch_apply(size_t iterations, dispatch_queue_t queue, void(^block)(size_t));此函数会反复执行一定次数,每次给块的参数递增1,从0开始。dispatch_apply所用的队列是并发队列。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(array.cout, queue, ^(size_t i){ id object = array[i]; [object performTask]; });这和用dispatch group的效果相同。
总结:
1.一系列任务可以归纳进dispatch group中,这组任务执行完成时获得回调通知。
2.用dispatch group,可以在并发队列中同时执行多项任务,GCD会根据系统资源状况来调度这些并发任务。
相关文章推荐
- OC高效率52之通过Dispatch Group机制,根据系统资源状况来执行任务
- 通过Dispatch Group机制,根据系统资源状况来执行任务
- 写高质量OC代码52建议总结:45.使用dispatch_once来执行只需要运行一次的线程安全代码
- 编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信
- 写高质量OC代码52建议总结:46.不要使用dispatch_get_current_queue
- 写高质量OC代码52建议总结:47.熟悉系统架构
- 编写高质量OC代码52建议总结:11.理解objc_msgSend的作用(消息机制)
- 写高质量OC代码52建议总结:28.通过协议提供匿名对象
- 编写高质量OC代码52建议总结:20.为私有方法加前缀
- 写高质量OC代码52建议总结:31.在dealloc方法中只释放引用并解除监听
- 编写高质量OC代码52建议总结:21.理解Objective-C的错误模型
- 写高质量OC代码52建议总结:38.为常用的块创建typedef
- 写高质量OC代码52建议总结:39.用handler块降低代码分散程度
- 编写高质量OC代码52建议总结:16.提供“全能初始化方法”
- 写高质量OC代码52建议总结:42.多用GCD,少用performSelector系列方法
- 编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
- 写高质量OC代码52建议总结:43.掌握GCD及操作队列的使用时机
- 写高质量OC代码52建议总结:29.理解引用计数
- 编写高质量OC代码52建议总结:24.将类的实现代码分散到便于管理的数个分类中
- 编写高质量OC代码52建议总结:9.以“族类模式“隐藏实现细节