iOS多线程学习小记『GCD的API之dispatch_appl
2018-07-25 本文已影响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");
});