1、For In循环
这也是最常用的一个方法。如果需要知道数组下标,用普通的For循环比较方便。
2、利用enumerateObjectsUsingBlock进行遍历
这种遍历方法代码整合度比较高,用enumerateObjectsWithOptions方法,可以对数组进行倒叙和逆序遍历,比较灵活。另外,使用这个方法对字典的遍历比较方便。
3、NSPredicate 谓词查询
NSPredicate 有些类似SQLite数据库查询,支持模糊搜索,多条件搜索等功能。但不支持调整遍历顺序(正序还是逆序)。
4、dispatch_apply 遍历
该方法利用GCD开启多条线程,并发处理任务,所以执行效率高,但不支持调整遍历顺序。
//
// main.m
// TestProject2
//
// Created by liben on 2021/10/23.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableArray* arr = [NSMutableArray new];
for(int i=1;i<100000;i++){
[arr addObject:[NSString stringWithFormat:@"%d",i]];
}
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF == %@",@"50000"];
NSTimeInterval start1 = CFAbsoluteTimeGetCurrent();
NSArray* arrFilter = [arr filteredArrayUsingPredicate:predicate];
NSTimeInterval interval1 = CFAbsoluteTimeGetCurrent() - start1;
NSLog(@"interval1:%f",interval1);
NSTimeInterval start2 = CFAbsoluteTimeGetCurrent();
for(NSString* s in arr){
if([s isEqualToString:@"50000"]){
NSTimeInterval iterval2 = CFAbsoluteTimeGetCurrent() - start2;
NSLog(@"interval2:%f",iterval2);
}
}
//迭代器
NSTimeInterval start3 = CFAbsoluteTimeGetCurrent();
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString* s = obj;
if([s isEqualToString:@"50000"]){
NSTimeInterval interval3 = CFAbsoluteTimeGetCurrent() - start3;
NSLog(@"interval3:%f",interval3);
*stop = YES;
return;
}
}];
}
return 0;
}
console:
2021-10-24 17:11:30.870836+0800 TestProject2[53802:6311998] interval1:0.027634
2021-10-24 17:11:30.877110+0800 TestProject2[53802:6311998] interval2:0.003602
2021-10-24 17:11:30.889720+0800 TestProject2[53802:6311998] interval3:0.007895
注:经过毫秒耗时检测,发现在数组个数小于1000,差别不是很明显。但当数组个数较大,ForIN的速度是最快的,其次是GCD。NSPredicate 表现的最慢。enumerateObjectsUsingBlock 表现中等,查询耗时相对稳定。
综上所述,一般正常开发中,大可根据需求选择对应的遍历方法。但如果是大量数据,就要结合需求和性能,选择一个比较合适的方法了。
网友评论