dispatch_apply使用说明
dispatch_apply类似一个for循环,会在指定的dispatch queue中运行block任务n次,如果队列是并发队列,则会并发执行block任务,dispatch_apply是一个同步调用,block任务执行n次后才返回。
/**
类似for循环
@param queue#> 提交到的队列 description#>
@param size_t 执行的次数
@return block执行结束后返回
*/
// dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t _Nonnull queue#>, <#^(size_t)block#>)
NSLog(@"执行情况:前面");
//dispatch_apply是一个同步调用,block任务执行n次后才返回
dispatch_apply(6, dispatch_get_global_queue(0, 0), ^(size_t i) {
[NSThread sleepForTimeInterval:arc4random()%5];
NSLog(@"线程:%@ 第 %zu 次",[NSThread currentThread],i);
});
NSLog(@"执行情况:END");
打印结果:
2017-05-05 16:46:59.188 Practice_Animation[16508:2072230] 执行情况:前面
2017-05-05 16:47:00.192 Practice_Animation[16508:2072257] 线程:<NSThread: 0x7fda8bf34c70>{number = 3, name = (null)} 第 1 次
2017-05-05 16:47:00.192 Practice_Animation[16508:2072259] 线程:<NSThread: 0x7fda8bc00620>{number = 2, name = (null)} 第 3 次
2017-05-05 16:47:02.189 Practice_Animation[16508:2072230] 线程:<NSThread: 0x7fda8be27eb0>{number = 1, name = main} 第 0 次
2017-05-05 16:47:02.192 Practice_Animation[16508:2072258] 线程:<NSThread: 0x7fda8bc4abc0>{number = 4, name = (null)} 第 2 次
2017-05-05 16:47:02.196 Practice_Animation[16508:2072259] 线程:<NSThread: 0x7fda8bc00620>{number = 2, name = (null)} 第 5 次
2017-05-05 16:47:03.197 Practice_Animation[16508:2072257] 线程:<NSThread: 0x7fda8bf34c70>{number = 3, name = (null)} 第 4 次
2017-05-05 16:47:03.198 Practice_Animation[16508:2072230] 执行情况:END
使用解说
输出 copy-index 顺序不确定,因为它是并行执行的(dispatch_get_global_queue是并行队列),但是return是在以上操作完成后才会执行,因此,它一般都是放在dispatch_async里面(异步)。实际上,这里 dispatch_apply如果换成串行队列上,则会依次输出index,但这样违背了我们想并行提高执行效率的初衷。
串行队列执行情况
NSLog(@"执行情况:前面");
//dispatch_apply是一个同步调用,block任务执行n次后才返回
dispatch_apply(6, dispatch_queue_create("com.eric", DISPATCH_QUEUE_SERIAL), ^(size_t i) {
//DISPATCH_QUEUE_CONCURRENT(并行)
//DISPATCH_QUEUE_SERIAL(串行)
[NSThread sleepForTimeInterval:arc4random()%5];
NSLog(@"线程:%@ 第 %zu 次",[NSThread currentThread],i);
});
NSLog(@"执行情况:END");
打印结果:
2017-05-05 16:55:06.140 Practice_Animation[16533:2130496] 执行情况:前面
2017-05-05 16:55:09.142 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 0 次
2017-05-05 16:55:12.143 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 1 次
2017-05-05 16:55:12.143 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 2 次
2017-05-05 16:55:16.144 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 3 次
2017-05-05 16:55:17.145 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 4 次
2017-05-05 16:55:20.147 Practice_Animation[16533:2130496] 线程:<NSThread: 0x7fc603616f00>{number = 1, name = main} 第 5 次
2017-05-05 16:55:20.147 Practice_Animation[16533:2130496] 执行情况:END
解说
我们可以明显感觉到整个打印过程变得缓慢,所以dispatch_apply高效使用是在并行队列中;
网友评论