上一篇 iOS多线程-GCD之dispatch_barrier_async
一、释义
void dispatch_apply(size_t iterations, dispatch_queue_t queue,
DISPATCH_NOESCAPE void (^block)(size_t));
该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束,好处是可以重复执行某项操作并复用我们的Block了!
第一个参数为重复次数;
第二个参数为追加对象的Dispatch Queue;
第三个参数为追加的操作,追加的Block中带有参数,这是为了按第一个参数重复追加Block并区分各个Block而使用。
dispatch_apply函数是dispatch_sync函数和Dispatch Group的关联API。
这是因为该函数会等待这些操作执行完毕再返回,内部操作执行是否同步依赖于传入的queue,外部就必定是同步的。
二、代码示例
- (void)testDispatchApply
{
//获取一个全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在全局队列queue上执行十次输出操作
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu", index);
});
NSLog(@"done!");
}
执行结果
2017-03-14 09:46:55.519 GCDLearn[626:16632] 3
2017-03-14 09:46:55.519 GCDLearn[626:16633] 1
2017-03-14 09:46:55.519 GCDLearn[626:16438] 0
2017-03-14 09:46:55.519 GCDLearn[626:16708] 2
2017-03-14 09:46:55.519 GCDLearn[626:16632] 4
2017-03-14 09:46:55.519 GCDLearn[626:16633] 5
2017-03-14 09:46:55.519 GCDLearn[626:16438] 6
2017-03-14 09:46:55.519 GCDLearn[626:16708] 7
2017-03-14 09:46:55.519 GCDLearn[626:16632] 8
2017-03-14 09:46:55.519 GCDLearn[626:16633] 9
2017-03-14 09:46:55.520 GCDLearn[626:16438] done!
分析:
当传入的queue是并行队列时,重复执行的操作输出是无序的,而done输出始终在最后。
把队列改为串行队列
dispatch_queue_t queue = dispatch_queue_create("com.gcd.dispatchApply.serialQueue", NULL);
执行结果:
2017-03-14 09:51:46.877 GCDLearn[652:18870] 0
2017-03-14 09:51:46.878 GCDLearn[652:18870] 1
2017-03-14 09:51:46.878 GCDLearn[652:18870] 2
2017-03-14 09:51:46.878 GCDLearn[652:18870] 3
2017-03-14 09:51:46.878 GCDLearn[652:18870] 4
2017-03-14 09:51:46.878 GCDLearn[652:18870] 5
2017-03-14 09:51:46.879 GCDLearn[652:18870] 6
2017-03-14 09:51:46.879 GCDLearn[652:18870] 7
2017-03-14 09:51:46.879 GCDLearn[652:18870] 8
2017-03-14 09:51:46.879 GCDLearn[652:18870] 9
2017-03-14 09:51:46.879 GCDLearn[652:18870] done!
由于dispatch_apply函数也与dispatch_sync函数相同,会等待处理执行结束,因此推荐在dispatch_async函数中非同步地执行dispatch_apply函数。
GCD学习代码 如果觉得有用,顺便给颗星哦😄
下一篇:iOS多线程-GCD之dispatch_apply