前段時(shí)間學(xué)習(xí)了NSEnumerator的遍歷方法 感覺很好用 于是總結(jié)一下iOS生涯當(dāng)中 所用到的遍歷斩狱。好奇的簡單了做了一個(gè)效率對(duì)比。沒想到最NB的居然是它扎瓶。
1喊废、for循環(huán)
for循環(huán)不做過多介紹,入門常用栗弟、可以正序污筷、逆序查詢數(shù)據(jù)。也常用于創(chuàng)建九宮格乍赫。貼兩行代碼自己體會(huì)瓣蛀。
//for--數(shù)組遍歷
for (int i = 0; i < self.traverseArray.count; i++) {
NSLog(@"%@",self.traverseArray[i]);
}
//for--字典遍歷
NSArray *dictionaryArray = [self.traverseDictionary allKeys];
for (int i = 0 ; i < dictionaryArray.count; i++) {
NSLog(@"key = %@",dictionaryArray[i]);
}
2、forin 循環(huán)
forin 遍歷 又稱快速遍歷 簡單實(shí)用 比for 循環(huán)等級(jí)高些 與for循環(huán)最明顯的區(qū)別就是看不到循環(huán)次數(shù)及索引情況雷厂。數(shù)組是有序的 for循環(huán)過程中也是有序的惋增,forin遍歷過程中是根據(jù)數(shù)組中數(shù)據(jù)添加順序而定的。
for (NSString *str in self.traverseArray) {
NSLog(@"%@",str);
}
forin 不可逆序遍歷 改鲫!
3诈皿、枚舉器
枚舉器是一種蘋果官方推薦的更加面向?qū)ο蟮囊环N遍歷方式,相比于for循環(huán),它具有高度解耦像棘、面向?qū)ο蠡鳌⑹褂梅奖愕葍?yōu)勢
想深入了解的我給大家推薦幾篇文章
//正序遍歷數(shù)組
[self.traverseArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"正序%@",obj);
}];
//逆序遍歷數(shù)組
[self.traverseArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"逆序%@",obj);
}];
//遍歷字典
#warning 字典是無序的不存在正序逆序
[self.traverseDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
NSLog(@"key:%@->value%@",key,value);
}];
4、dispatch_apply函數(shù)
GCD dispatch_apply函數(shù)是一個(gè)同步調(diào)用缕题,block任務(wù)執(zhí)行n次后才返回截歉。該函數(shù)比較適合處理耗時(shí)較長、迭代次數(shù)較多的情況烟零。
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_apply(self.traverseArray.count, queue, ^(size_t insex) {
NSLog(@"%@",self.traverseArray[insex]);
});
5瘪松、ReactiveCocoa 遍歷方法
ReactiveCocoa 中遍歷主要是針對(duì)元組RACTuple,對(duì)于數(shù)組锨阿、字典的遍歷都會(huì)包裝成RACTuple進(jìn)行處理宵睦。
使用方法先集成ReactiveCocoa 點(diǎn)這里
集成方法有所改變
cocopods引入時(shí) pod ‘ReactiveObjC’
項(xiàng)目引入中 #import "ReactiveObjC/ReactiveObjC.h"
//數(shù)組遍歷
[self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//字典遍歷 相當(dāng)于元組數(shù)據(jù)
[self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
// 解包元組,會(huì)把元組的值墅诡,按順序給參數(shù)里面的變量賦值
RACTupleUnpack(NSString *key,NSString*value) = x;
NSLog(@"key=%@ value=%@",key,value);
}];
重點(diǎn)來了
終于說到重點(diǎn)了看一下以上幾種遍歷方式 在100壳嚎、10000、100000次遍歷所耗時(shí)長。
看圖分析诬辈、自己領(lǐng)會(huì)〖黾可以根據(jù)自己的需求使用不同的遍歷方式焙糟!
然后。样屠。穿撮。然后沒有然后了。
Demo:https://github.com/DearWang/TraverseDemo
參考文檔
https://github.com/ReactiveCocoa/ReactiveObjC
http://www.reibang.com/p/5d4a8be9baf7