如何快速迭代NSArray

时间:2013-12-03 10:41:29

标签: ios objective-c for-loop nsarray nsdictionary

我有一个迭代NSDrray NSDrray的方法,并在满足if语句时更改值。但是,对于800个物体,这可能需要15-20秒。我希望它更快,并认为我的逻辑可能会得到改善。这就是我在做的事情:

// inside my method
for (int i = 0; i < [sortedItemsArray count]; i++) {
        NSDictionary *tempInstForCopy = [sortedItemsArray objectAtIndex:i];
        tempInstObjectDictionary = [tempInstForCopy mutableCopy];
        tempInstForCopy = nil;
        // show InsFitButton
        if (([[tempInstObjectDictionary objectForKey:@"newIComp"] isEqualToString:@"T"]) && ([[tempInstObjectDictionary objectForKey:@"newJCom"] isEqualToString:@"W"])) {
// make changes in here. continue with the loop.

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:4)

尝试快速枚举:

for (NSDictionary *tempInstForCopy in sortedItemsArray) {

}

另外,也许你不需要为每个条目制作每个字典的副本,你可以将它作为可变的存储来存储。

答案 1 :(得分:1)

您可以对所有集合类及其子类使用快速枚举:

for (<objectType> objectName in <collectionObject>{
   ...
} 

注意 :您无法在快速枚举中更改/更新objectName,因为它变为常量。

答案 2 :(得分:1)

这是最有效的方法

for (id object in array) {
    // do whatever you want
}

答案 3 :(得分:0)

通过快速迭代,我猜你正在讨论这个循环的运行时间吗?对于您的示例,如果您不必每次都创建字典的副本,则会更快。尝试将其更改为NSMutableDictionary类型

在遍历此数组时,是否有任何可以缩短进程的情况?如果您更改了值,是否必须继续循环,或者break;(并且可能保存当前索引并在需要时继续)?

我不知道你确切的问题,但是通常可以将更大的数组拆分成更小的子阵列,你可以更好地定位。

答案 4 :(得分:0)

除了让循环本身更快的答案之外,我同意循环不是你的问题,而是你在循环中做的事情。

在将项目更改为可变字典之前,我会使用自定义类。

在第一个视图中有两个问题:

  • 您为每个项目创建一个可变副本。对象创建可能很慢。

  • 您必须再次将更改后的副本插入数组,不是吗?

如果你有自定义类(或可变字典)的实例,那么这两个操作都会更便宜。如果仅在tempInstObjectDictionary内创建可变副本(if),则不会更改项的类型,它会改善运行时行为,因此只有在需要时才会创建它。

答案 5 :(得分:0)

速度优化总是“有趣”。请注意,以下提示可能对您的特定情况没有帮助,并且是为了速度而不是可读性而设计的。 (这是一个大红旗)。

除了来自Antonio MG的快速枚举技巧以及在堆栈中更早地将字典更改为Mutable之外,还有一些其他步骤可供您研究:

例如,如果您知道[[tempInstObjectDictionary objectForKey:@"newIComp"] isEqualToString:@"T"][[tempInstObjectDictionary objectForKey:@"newJCom"] isEqualToString:@"W"]更多地注册TRUE (反之亦然),您可以保存一些嵌套两个ifs *的周期,检查首先是最罕见的情况:

if ([[tempInstObjectDictionary objectForKey:@"newJCom"] isEqualToString:@"W"]){
    if ([[tempInstObjectDictionary objectForKey:@"newIComp"] isEqualToString:@"T"]){
        // make changes in here. continue with the loop.
    }
}

此外,根据您的设计和您要实现的目标,您可以通过添加需要更改为新数组的字典来改进性能,并在完成循环后在另一个线程上更改它们...

*实际上我不确定你是否需要嵌套它们,切换顺序可能会达到同样的效果(?)任何编译专家都可以自由地编写...