dispatch_apply使用說(shuō)明
dispatch_apply類似一個(gè)for循環(huán)屿衅,會(huì)在指定的dispatch queue中運(yùn)行block任務(wù)n次埃难,如果隊(duì)列是并發(fā)隊(duì)列,則會(huì)并發(fā)執(zhí)行block任務(wù)涤久,dispatch_apply是一個(gè)同步調(diào)用涡尘,block任務(wù)執(zhí)行n次后才返回。
/**
類似for循環(huán)
@param queue#> 提交到的隊(duì)列 description#>
@param size_t 執(zhí)行的次數(shù)
@return block執(zhí)行結(jié)束后返回
*/
// dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t _Nonnull queue#>, <#^(size_t)block#>)
NSLog(@"執(zhí)行情況:前面");
//dispatch_apply是一個(gè)同步調(diào)用响迂,block任務(wù)執(zhí)行n次后才返回
dispatch_apply(6, dispatch_get_global_queue(0, 0), ^(size_t i) {
[NSThread sleepForTimeInterval:arc4random()%5];
NSLog(@"線程:%@ 第 %zu 次",[NSThread currentThread],i);
});
NSLog(@"執(zhí)行情況:END");
打印結(jié)果:
2017-05-05 16:46:59.188 Practice_Animation[16508:2072230] 執(zhí)行情況:前面
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] 執(zhí)行情況:END
使用解說(shuō)
輸出 copy-index 順序不確定考抄,因?yàn)樗遣⑿袌?zhí)行的(dispatch_get_global_queue是并行隊(duì)列),但是return是在以上操作完成后才會(huì)執(zhí)行蔗彤,因此川梅,它一般都是放在dispatch_async里面(異步)。實(shí)際上然遏,這里 dispatch_apply如果換成串行隊(duì)列上贫途,則會(huì)依次輸出index,但這樣違背了我們想并行提高執(zhí)行效率的初衷待侵。
串行隊(duì)列執(zhí)行情況
NSLog(@"執(zhí)行情況:前面");
//dispatch_apply是一個(gè)同步調(diào)用丢早,block任務(wù)執(zhí)行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(@"執(zhí)行情況:END");
打印結(jié)果:
2017-05-05 16:55:06.140 Practice_Animation[16533:2130496] 執(zhí)行情況:前面
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] 執(zhí)行情況:END
解說(shuō)
我們可以明顯感覺(jué)到整個(gè)打印過(guò)程變得緩慢,所以dispatch_apply高效使用是在并行隊(duì)列中秧倾;