我遇到了以下崩溃:
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread: 0
Application Specific Information:
com.[app name].[app name] failed to scene-update in time
Elapsed total CPU time (seconds): 5.050 (user 5.050, system 0.000), 24% CPU
Elapsed application CPU time (seconds): 0.044, 0% CPU
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x0000000195018e48 semaphore_wait_trap + 8
1 libdispatch.dylib 0x0000000194efbf3c _dispatch_semaphore_wait_slow + 252
2 CFNetwork 0x00000001832a2220 CFURLConnectionSendSynchronousRequest + 284
3 CFNetwork 0x00000001832c27c8 +[NSURLConnection sendSynchronousRequest:returningResponse:error:] + 116
4 Foundation 0x0000000184726358 -[NSData(NSData) initWithContentsOfURL:options:error:] + 308
5 Foundation 0x0000000184726204 +[NSData(NSData) dataWithContentsOfURL:options:error:] + 72
6 [app name] 0x00000001000b1a30 0x100090000 + 137776
7 [app name] 0x00000001001e3f44 0x100090000 + 1392452
8 libdispatch.dylib 0x0000000194eed990 _dispatch_call_block_and_release + 20
9 libdispatch.dylib 0x0000000194eed950 _dispatch_client_callout + 12
10 libdispatch.dylib 0x0000000194ef2208 _dispatch_main_queue_callback_4CF + 1604
11 CoreFoundation 0x00000001838962e8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
12 CoreFoundation 0x0000000183894390 __CFRunLoopRun + 1488
13 CoreFoundation 0x00000001837c11f0 CFRunLoopRunSpecific + 392
14 GraphicsServices 0x000000018cae36f8 GSEventRunModal + 164
15 UIKit 0x0000000188152108 UIApplicationMain + 1484
16 [app name] 0x00000001000dd2ac 0x100090000 + 316076
17 libdyld.dylib 0x0000000194f1aa04 start + 0
在以下代码中:
@try {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^(void) {
NSData* data = [NSData dataWithContentsOfURL:xxxxxxx options:NSDataReadingUncached error:&error];
...
[self.buffer performSelectorOnMainThread:@selector(addObject:) withObject:data waitUntilDone:YES];
}
@catch (NSException* error) {
NSLog(@"error: %@", error);
}
是的,也有一个失败块,但我将代码简化为本质,导致崩溃的纯代码。
此代码每小时运行数百次,没有任何问题。但是它时不时地崩溃。总是一样的崩溃(如上面那个)。首先,应用程序冻结,然后崩溃。永远不会执行catch-block。
performSelectorOnMainThread使用一个对象。并且该对象(在主线程中)被添加到NSMutableArray(self.buffer是NSMutableArray)。我知道NSMutableArrays不是线程安全的,这就是我在主线程上执行它们的原因。对于waitUntilDone,我使用YES来防止线程在插入对象之前结束。我也没用,但是不断崩溃。
有没有人知道为什么会发生这种崩溃?你可能有一个解决方案让我阻止这个吗?
非常感谢。
答案 0 :(得分:0)
在更新UI时,您正在主线程上进行网络i / o。这需要太长时间。不要在主线程上这样做。相反,使用异步方式运行URL提取并缓存结果,以便下次用户界面更新可以使用它。
更多信息:
https://developer.apple.com/library/ios/qa/qa1693/_index.html
答案 1 :(得分:0)
在主线程上写入数组并不会使线程安全。使用专用的dispatch_queue来控制对nsmutablearray的访问,包括读取和写入操作。