美文网首页
iOS多线程学习小记『GCD的API之dispatch_appl

iOS多线程学习小记『GCD的API之dispatch_appl

作者: 达若漠沙 | 来源:发表于2018-07-25 20:46 被阅读17次

3.2.9 dispatch_apply

dispatch_apply 函数是dispatch_async函数和Dispatch Group的关联API。该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束。

例如,该源码的执行结果为:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%zu",index);
    });
    NSLog(@"done");

2
1
0
3
6
5
4
7
8
9
done

  • 因为在Global Dispatch Queue中执行处理,所以各个处理的执行时间不定。但是输出结果中最后的done必定在最后的位置上。这是因为dispatch_apply函数会等待全部处理执行结束。

  • 第一个参数为重复次数,第二个参数为追加对象Dispatch Queue,第三个参数为追加的处理。与到目前为止所出现的例子不同,第三个参数的Block为带有参数的Block.这是为了按第一个参数重复追加Block并区分各个Block而使用。例如要对NSArray类对象的所有元素执行处理时,不必一个一个编写for循环部分。

  • 我们来看一下下面的源代码。

    NSArray * array = @[@"001",@"002",@"003"];
    dispatch_apply([array count], queue, ^(size_t index) {
        NSLog(@"123   %zu:%@",index,[array objectAtIndex:index]);
    });

这样可简单地在Global Dispatch Queue中对所有的元素执行Block.

另外,由于dispatch_apply函数也与dispatch_sync函数相同,会等待处理执行结束,因此推荐在dispatch_async函数中非同步地执行dispatch_apply函数

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSArray * array = @[@"001",@"002",@"003"];
    dispatch_async(queue, ^{

        dispatch_apply([array count], queue, ^(size_t index) {
            NSLog(@"%zu:%@",index,[array objectAtIndex:index]);
        });
    });

    //回到主线程
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"done");
    });

相关文章

网友评论

      本文标题:iOS多线程学习小记『GCD的API之dispatch_appl

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