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秒或更长时间,似乎让用户等待这么长时间!
想法?
您使用快速枚举设置循环,然后忽略它.
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)
这两个更改都会加速您的代码并显着降低内存使用量,并且可能会消除导致您遇到的奇怪错误的任何内容.
三件事:
此外,您似乎正在使用自己的位置类.将其更改为返回双精度而不是(我假设)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)
| 归档时间: |
|
| 查看次数: |
627 次 |
| 最近记录: |