我有一个迭代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.
非常感谢任何帮助。
答案 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.
}
}
此外,根据您的设计和您要实现的目标,您可以通过添加需要更改为新数组的字典来改进性能,并在完成循环后在另一个线程上更改它们...
*实际上我不确定你是否需要嵌套它们,切换顺序可能会达到同样的效果(?)任何编译专家都可以自由地编写...