美文网首页
GCD中dispatch_apply使用

GCD中dispatch_apply使用

作者: 山水域 | 来源:发表于2017-05-05 17:02 被阅读100次

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高效使用是在并行队列中;

相关文章

网友评论

      本文标题:GCD中dispatch_apply使用

      本文链接:https://www.haomeiwen.com/subject/rtvjtxtx.html