『導(dǎo)言』
iOS開發(fā)中經(jīng)常用到遍歷數(shù)據(jù)用到for循環(huán),其實(shí)GCD中有個(gè)更好用的方法來快速迭代,下面我們來看看兩者的區(qū)別和聯(lián)系。
一、代碼分析(用遍歷0到9的10個(gè)數(shù)字為例):
- for循環(huán):
- 遍歷10個(gè)數(shù)字
for (int i = 0; i<10; i++) {
NSLog(@"i = %d,線程 = %@",i,[NSThread currentThread]);
}
```
* 結(jié)果打印
2017-02-16 14:58:01.070 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 0,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.071 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 1,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.071 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 2,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.071 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 3,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.071 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 4,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.071 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 5,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.072 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 6,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.072 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 7,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.072 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 8,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
2017-02-16 14:58:01.072 02-掌握-GCD的快速迭代-zwj[1420:97101] i = 9,線程 = <NSThread: 0x6080000654c0>{number = 1, name = main}
* 結(jié)果分析
結(jié)果:number= 1,始終只在主線程執(zhí)行,如果,遍歷數(shù)據(jù)很多的話,項(xiàng)目運(yùn)行肯定會(huì)卡。
* GCD循環(huán):
* GCD遍歷代碼`dispatch_apply`
/**
@param iterations#> 遍歷的次數(shù),相當(dāng)于i=10 description#>
@param queue#> 隊(duì)列(必須為并發(fā)隊(duì)列,串行隊(duì)列無意義;也不能傳主隊(duì)列,因?yàn)樗梨i) description#>dispatch_get_global_queue
@param size_t <#size_t description#>
@return 索引index 相當(dāng)于i為0到9
*/
// dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t _Nonnull queue#>, <#^(size_t)block#>)
dispatch_apply(10,dispatch_get_global_queue(0, 0), ^(size_t index) {
NSLog(@"%zd = %@",index,[NSThread currentThread]);
});
* 打印結(jié)果
2017-02-16 15:10:38.602 02-掌握-GCD的快速迭代-zwj[1447:102911] 3 = <NSThread: 0x608000268e40>{number = 5, name = (null)}
2017-02-16 15:10:38.602 02-掌握-GCD的快速迭代-zwj[1447:102666] 0 = <NSThread: 0x60000007ee80>{number = 1, name = main}
2017-02-16 15:10:38.602 02-掌握-GCD的快速迭代-zwj[1447:102912] 2 = <NSThread: 0x60000026ca00>{number = 4, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102910] 1 = <NSThread: 0x60800007eac0>{number = 3, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102911] 4 = <NSThread: 0x608000268e40>{number = 5, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102666] 5 = <NSThread: 0x60000007ee80>{number = 1, name = main}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102912] 6 = <NSThread: 0x60000026ca00>{number = 4, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102910] 7 = <NSThread: 0x60800007eac0>{number = 3, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102911] 8 = <NSThread: 0x608000268e40>{number = 5, name = (null)}
2017-02-16 15:10:38.603 02-掌握-GCD的快速迭代-zwj[1447:102666] 9 = <NSThread: 0x60000007ee80>{number = 1, name = main}
* 結(jié)果分析
1. index(相當(dāng)于for循環(huán)的i)遍歷10次。打印線程的number 為1.3.4.5,其中1表示主線程,非1得為子線程,即開啟了主線程和子線程來執(zhí)行任務(wù)。
2.GCD的遍歷為:異步函數(shù)&并發(fā)隊(duì)列,必須為并發(fā)隊(duì)列,串行隊(duì)列無意義;也不能傳主隊(duì)列,因?yàn)樗梨i.
3.快的原因(異步的并發(fā)的隊(duì)列,自動(dòng)開啟子線程