前段时间学习了NSEnumerator的遍历方法 感觉很好用 于是总结一下iOS生涯当中 所用到的遍历。好奇的简单了做了一个效率对比。没想到最NB的居然是它。
1、for循环
for循环不做过多介绍,入门常用、可以正序、逆序查询数据。也常用于创建九宫格。贴两行代码自己体会。
//for--数组遍历
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 循环
forin 遍历 又称快速遍历 简单实用 比for 循环等级高些 与for循环最明显的区别就是看不到循环次数及索引情况。数组是有序的 for循环过程中也是有序的,forin遍历过程中是根据数组中数据添加顺序而定的。
for (NSString *str in self.traverseArray) {
NSLog(@"%@",str);
}
forin 不可逆序遍历 !
3、枚举器
枚举器是一种苹果官方推荐的更加面向对象的一种遍历方式,相比于for循环,它具有高度解耦、面向对象、使用方便等优势
想深入了解的我给大家推荐几篇文章
//正序遍历数组
[self.traverseArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"正序%@",obj);
}];
//逆序遍历数组
[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函数
GCD dispatch_apply函数是一个同步调用,block任务执行n次后才返回。该函数比较适合处理耗时较长、迭代次数较多的情况。
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 中遍历主要是针对元组RACTuple,对于数组、字典的遍历都会包装成RACTuple进行处理。
使用方法先集成ReactiveCocoa 点这里
集成方法有所改变
cocopods引入时 pod ‘ReactiveObjC’
项目引入中 #import "ReactiveObjC/ReactiveObjC.h"
//数组遍历
[self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//字典遍历 相当于元组数据
[self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
// 解包元组,会把元组的值,按顺序给参数里面的变量赋值
RACTupleUnpack(NSString *key,NSString*value) = x;
NSLog(@"key=%@ value=%@",key,value);
}];
重点来了
终于说到重点了看一下以上几种遍历方式 在100、10000、100000次遍历所耗时长。
耗时时间表.png
看图分析、自己领会。可以根据自己的需求使用不同的遍历方式!
然后。。。然后没有然后了。
Demo:https://github.com/DearWang/TraverseDemo
参考文档
https://github.com/ReactiveCocoa/ReactiveObjC
https://www.jianshu.com/p/5d4a8be9baf7
网友评论