iPhone:快速枚举,不够快?

Nic*_*ard 0 iphone objective-c

我试图循环一个包含大约6500个项目的NSSet.我在用:

for (id Location in sortedArray) {
            loc = [sortedArray objectAtIndex:i];
            cord = [cord stringByAppendingString:[NSString stringWithFormat:@"%f,%f ",[loc.longitude doubleValue],[loc.latitude doubleValue]]];
            i++;
        }
Run Code Online (Sandbox Code Playgroud)

这工作正常,但似乎它不够快.它到达项目5700,我收到以下错误:

Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")
Run Code Online (Sandbox Code Playgroud)

有没有办法比这更快地循环数据?它需要大约20秒或更长时间,似乎让用户等待这么长时间!

想法?

ben*_*ado 7

您使用快速枚举设置循环,然后忽略它.

for (id Location in sortedArray) {
    loc = [sortedArray objectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)

第一行设置一个名为loop的局部变量Location,该变量在每次迭代时指向数组中的一个项目.但是你忽略了那个变量并使用了第二个变量loc,并且第二次从数组中获取值.您应该将其重写为:

for (id loc in sortedArray) {
    cord = [cord stringByAppendingString:...]
}
Run Code Online (Sandbox Code Playgroud)

虽然我们正在努力,但你构建cord弦乐的方式却是坚果.您将通过循环在每次迭代中创建一个新字符串.使用NSMutableString并appendFormat:在每次迭代时调用会更聪明.然后,您将不会使用数千个未使用的NSString对象填充自动释放池.所以像这样:

NSMutableString *cord = [NSMutableString string];
for (id loc in sortedArray) {
    [cord appendFormat:...];
}
Run Code Online (Sandbox Code Playgroud)

这两个更改都会加速您的代码并显着降低内存使用量,并且可能会消除导致您遇到的奇怪错误的任何内容.


tc.*_*tc. 6

三件事:

  • 你循环遍历一个数组,而不是一个集合.如果您不关心订单,请循环设置.
  • 您没有使用"快速枚举"API.
  • + [NSString stringWithFormat:]返回一个自动释放的对象. - [NSString stringByAppendingString:]返回另一个自动释放的对象.你耗费了大量的内存.
  • - [NSString stringByAppendingString:]创建自身的副本,然后附加新字符串.每次你创建一个字符串,复制量就会增加; 你的算法是O(n 2).6500 2相当大.

此外,您似乎正在使用自己的位置类.将其更改为返回双精度而不是(我假设)NSNumber*s.绝对不要退回NSStrings; 从字符串转换为double是slooooooow.或者,返回CLLocationCoordinate2D(两个双精度的结构)以避免额外的方法调用.

让我无耻地重写你的代码:

NSMutableString * cord = [NSMutableString stringWithCapacity:cord.count*20];
for (Location * loc in sortedArray) {
  [cord appendFormat:@"%f,%f ",[loc.longitude doubleValue],[loc.latitude doubleValue]];
}
Run Code Online (Sandbox Code Playgroud)