变更记录

序号 录入时间 录入人 备注
1 2016-11-23 Alfred Jiang -

方案名称

NSArray \ NSDictionary \ NSSet - 遍历与倒序遍历

关键字

NSArray \ NSDictionary \ NSSet \ 遍历 \ 倒序遍历

需求场景

  1. 需要对数组进行遍历和倒序遍历时

参考链接

  1. Sunnyxx - iOS 中集合遍历方法的比较和技巧(推荐)
  2. NSHipster - NSFast​Enumeration / NSEnumerator

详细内容

倒序遍历

1. 使用 reverseObjectEnumerator
1
2
3
4
NSArray *strings = @[@"1", @"2", @"3"];
for (NSString *string in [strings reverseObjectEnumerator]) {
NSLog(@"%@", string);
}
2. 使用 enumerateObjectsWithOptions:NSEnumerationReverse
1
2
3
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
[sark doSomething];
}];

使用 block 同时遍历字典 key,value

1
2
3
4
NSDictionary *dict = @{@"a": @"1", @"b": @"2"};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key: %@, value: %@", key, obj);
}];

对于耗时且顺序无关的遍历,使用并发版本

1
2
3
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
[sark doSomethingSlow];
}];

注意

  • 对于集合中对象数很多的情况下,for in (NSFastEnumeration) 的遍历速度非常之快,但小规模的遍历并不明显(还没普通 for 循环快)
  • 使用 kvc 集合运算符运算很大规模的集合时,效率明显下降( 100 万的数组离谱的 21 秒多),同时占用了大量内存和 cpu
  • enumerateObjectsWithOptions(NSEnumerationConcurrent)dispatch_apply(Concurrent) 的遍历执行可以利用到多核 cpu 的优势(实验中在双核 cpu 上效率基本上 x 2)

效果图

(无)

备注

(无)