如何利用iOS多核高效遍歷數(shù)組.

我們知道遍歷數(shù)組是一個(gè)相對(duì)耗時(shí)的操作,而同時(shí)手機(jī)的核是越來越多,所以我們需要充分利用iOS多核的作用.
特別是在遍歷操作中還有其他耗時(shí)操作.像我們平時(shí)直接遍歷數(shù)組的操作
for (NSInteger i= 0,i< 100,i++){
//do something
}
這樣的代碼不會(huì)隨著手機(jī)的不斷升級(jí)而提高效率.
但是利用GCD可以實(shí)現(xiàn)充分利用多核.并且隨著手機(jī)不斷升級(jí),同樣的代碼,執(zhí)行效率會(huì)自動(dòng)提高,十分OK.下面提供兩種常用方法.
NSArray * arr = @[@"1",@"2",@"3",@"4",@"5"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

for (NSInteger i = 0; i < arr.count; i++) {
    NSLog(@"%ld",(long)i);
    dispatch_group_async(group, queue, ^{
        sleep(5);
        NSLog(@"%ld -- %@",(long)i,[NSThread currentThread]);
    });
}
//dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 等待queue任務(wù)執(zhí)行完,才往下走;
dispatch_group_notify(group, queue, ^{ // 往下走,回調(diào)block
    NSLog(@"group end");

});

NSLog(@"end”);
2016-07-26 15:59:09.566 ****學(xué)習(xí)之路****[4448:1770686] 0
2016-07-26 15:59:09.566 ****學(xué)習(xí)之路****[4448:1770686] 1
2016-07-26 15:59:09.566 ****學(xué)習(xí)之路****[4448:1770686] 2
2016-07-26 15:59:09.567 ****學(xué)習(xí)之路****[4448:1770686] 3
2016-07-26 15:59:09.567 ****學(xué)習(xí)之路****[4448:1770686] 4
2016-07-26 15:59:09.567 ****學(xué)習(xí)之路****[4448:1770686] end
2016-07-26 15:59:14.569 ****學(xué)習(xí)之路****[4448:1772333] 4 -- <NSThread: 0x7fc412631120>{number = 6, name = (null)}
2016-07-26 15:59:14.569 ****學(xué)習(xí)之路****[4448:1772330] 1 -- <NSThread: 0x7fc4124bf8e0>{number = 2, name = (null)}
2016-07-26 15:59:14.569 ****學(xué)習(xí)之路****[4448:1771326] 0 -- <NSThread: 0x7fc4126255e0>{number = 3, name = (null)}
2016-07-26 15:59:14.569 ****學(xué)習(xí)之路****[4448:1772332] 3 -- <NSThread: 0x7fc41261d900>{number = 5, name = (null)}
2016-07-26 15:59:14.569 ****學(xué)習(xí)之路****[4448:1772331] 2 -- <NSThread: 0x7fc4124bb230>{number = 4, name = (null)}

2016-07-26 15:59:14.570 ****學(xué)習(xí)之路****[4448:1772331] group end

dispatch group 只能異步,并且不會(huì)在主線程走任務(wù)

NSArray * arr = @[@"1",@"2",@"3",@"4",@"5"];

dispatch_apply([arr count], dispatch_get_global_queue(0, 0), ^(size_t index) {
sleep(1);
NSLog(@"%@ %@",arr[index],[NSThread currentThread]);

});

NSLog(@"end”);
dispatch_apply它以指定的次數(shù)將指定的Block加入到指定的隊(duì)列中,并等待隊(duì)列中操作全部完成,NSLog(@"end”)在上面任務(wù)執(zhí)行完才會(huì)執(zhí)行

2016-07-26 16:00:58.106 ****學(xué)習(xí)之路****[4463:1787375] 2 <NSThread: 0x7f98fa61aff0>{number = 4, name = (null)}
2016-07-26 16:00:58.106 ****學(xué)習(xí)之路****[4463:1787363] 3 <NSThread: 0x7f98fa61e680>{number = 2, name = (null)}
2016-07-26 16:00:58.106 ****學(xué)習(xí)之路****[4463:1787587] 4 <NSThread: 0x7f98fa747a00>{number = 3, name = (null)}
2016-07-26 16:00:58.106 ****學(xué)習(xí)之路****[4463:1787047] 1 <NSThread: 0x7f98fa402c30>{number = 1, name = main}
2016-07-26 16:00:59.110 ****學(xué)習(xí)之路****[4463:1787375] 5 <NSThread: 0x7f98fa61aff0>{number = 4, name = (null)}

2016-07-26 16:00:59.110 ****學(xué)習(xí)之路****[4463:1787047] end


dispatch apply 是同步的,可以在主線程走任務(wù),如果想異步可以在外面包一層
NSArray * arr = @[@"1",@"2",@"3",@"4",@"5"];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_apply([arr count], dispatch_get_global_queue(0, 0), ^(size_t index) {
sleep(1);
NSLog(@"%@ %@",arr[index],[NSThread currentThread]);

  });

});
NSLog(@"end");

}
但是這樣效果就和dispatch group一樣了,不會(huì)在主線程走任務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容