变更记录
序号 | 录入时间 | 录入人 | 备注 |
---|---|---|---|
1 | 2016-11-23 | Alfred Jiang | - |
方案名称
NSArray \ NSDictionary \ NSSet - 遍历与倒序遍历
关键字
NSArray \ NSDictionary \ NSSet \ 遍历 \ 倒序遍历
需求场景
- 需要对数组进行遍历和倒序遍历时
参考链接
详细内容
倒序遍历
1. 使用 reverseObjectEnumerator
NSArray *strings = @[@"1", @"2", @"3"];
for (NSString *string in [strings reverseObjectEnumerator]) {
NSLog(@"%@", string);
}
2. 使用 enumerateObjectsWithOptions:NSEnumerationReverse
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
[sark doSomething];
}];
使用 block 同时遍历字典 key,value
NSDictionary *dict = @{@"a": @"1", @"b": @"2"};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key: %@, value: %@", key, obj);
}];
对于耗时且顺序无关的遍历,使用并发版本
[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)
效果图
(无)
备注
(无)