我得到一个"只能在主线程上运行"内部深处(或之后)的异常
[self.navigationController pushViewController:controller animated:YES];
事情是它只发生在模拟器上而不是在IOS设备中进行调试时 我有机会解决这个问题吗?
转储:
2014-03-25 15:18:45.061 Cookila[657:5507] *** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation_Sim/UIFoundation-264.8/UIFoundation/TextSystem/NSLayoutManager_Private.m:1510
2014-03-25 15:18:45.086 Cookila[657:5507] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
*** First throw call stack:
(
0 CoreFoundation 0x027251e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x024a48e5 objc_exception_throw + 44
2 CoreFoundation 0x02725048 +[NSException raise:format:arguments:] + 136
3 Foundation 0x01f43b20 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 101
4 UIFoundation 0x0947fe25 -[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 419
5 UIFoundation 0x0947fb0a -[NSLayoutManager(NSPrivate) _recalculateUsageForTextContainerAtIndex:] + 2083
6 UIFoundation 0x094b4289 _enableTextViewResizing + 234
7 UIFoundation 0x094b7e89 -[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 688
8 UIFoundation 0x094b7f0e -[NSLayoutManager processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:] + 82
9 UIFoundation 0x094e0ab5 -[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 153
10 UIFoundation 0x094e05f0 -[NSTextStorage processEditing] + 462
11 UIFoundation 0x094e0199 -[NSTextStorage endEditing] + 80
12 UIFoundation 0x094e0223 -[NSTextStorage coordinateEditing:] + 66
13 UIKit 0x016618cb -[UITextView setAttributedText:] + 254
14 UIKit 0x01660c16 -[UITextView initWithCoder:] + 706
15 UIKit 0x01372d6d UINibDecoderDecodeObjectForValue + 704
16 UIKit 0x01372f6e UINibDecoderDecodeObjectForValue + 1217
17 UIKit 0x01372aa1 -[UINibDecoder decodeObjectForKey:] + 114
18 UIKit 0x00faafa4 -[UIView initWithCoder:] + 842
19 UIKit 0x01372d6d UINibDecoderDecodeObjectForValue + 704
20 UIKit 0x01372f6e UINibDecoderDecodeObjectForValue + 1217
21 UIKit 0x01372aa1 -[UINibDecoder decodeObjectForKey:] + 114
22 UIKit 0x00faafa4 -[UIView initWithCoder:] + 842
23 UIKit 0x00fcdff1 -[UIScrollView initWithCoder:] + 58
24 UIKit 0x01372d6d UINibDecoderDecodeObjectForValue + 704
25 UIKit 0x01372aa1 -[UINibDecoder decodeObjectForKey:] + 114
26 UIKit 0x0120d7a7 -[UIRuntimeConnection initWithCoder:] + 191
27 UIKit 0x01372d6d UINibDecoderDecodeObjectForValue + 704
28 UIKit 0x01372f6e UINibDecoderDecodeObjectForValue + 1217
29 UIKit 0x01372aa1 -[UINibDecoder decodeObjectForKey:] + 114
30 UIKit 0x0120cc21 -[UINib instantiateWithOwner:options:] + 1117
31 UIKit 0x010756f5 -[UIViewController _loadViewFromNibNamed:bundle:] + 280
32 UIKit 0x01075e9d -[UIViewController loadView] + 302
33 UIKit 0x010760d3 -[UIViewController loadViewIfRequired] + 78
34 UIKit 0x010765d9 -[UIViewController view] + 35
35 UIKit 0x01090942 -[UINavigationController _startCustomTransition:] + 778
36 UIKit 0x0109d8f7 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688
37 UIKit 0x0109e4e9 -[UINavigationController __viewWillLayoutSubviews] + 57
38 UIKit 0x011df0d1 -[UILayoutContainerView layoutSubviews] + 213
39 UIKit 0x00fc6964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
40 libobjc.A.dylib 0x024b682b -[NSObject performSelector:withObject:] + 70
41 QuartzCore 0x00e2e45a -[CALayer layoutSublayers] + 148
42 QuartzCore 0x00e22244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
43 QuartzCore 0x00e220b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
44 QuartzCore 0x00d887fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
45 QuartzCore 0x00d89b85 _ZN2CA11Transaction6commitEv + 393
46 QuartzCore 0x00d89dd6 _ZN2CA11Transaction14release_threadEPv + 226
47 libsystem_pthread.dylib 0x031f581c _pthread_tsd_cleanup + 93
48 libsystem_pthread.dylib 0x031f227e _pthread_exit + 108
49 libsystem_pthread.dylib 0x031f21e8 pthread_exit + 33
50 Foundation 0x01ef1dd2 __NSFinalizeThreadData + 0
51 Foundation 0x01eee97e __NSThread__main__ + 1299
52 libsystem_pthread.dylib 0x031f15fb _pthread_body + 144
53 libsystem_pthread.dylib 0x031f1485 _pthread_struct_init + 0
54 libsystem_pthread.dylib 0x031f6cf2 thread_start + 34
)
libc++abi.dylib: terminating with uncaught exception of type NSException
答案 0 :(得分:28)
请从主线程进行UI回调。您必须从不从后台线程更新您的用户界面。
使用Grand Central Dispatch:
进行UI更新dispatch_async(dispatch_get_main_queue(), ^{
/* Your UI code */
});
答案 1 :(得分:3)
Swift中的代码。
dispatch_async(dispatch_get_main_queue()){
self.navigationController?.setViewControllers([viewController], animated: true)
}
答案 2 :(得分:2)
DispatchQueue.main.async(){
//write your code
}
答案 3 :(得分:0)
原因是使用来自不同线程的代码调用。你尝试过一些dispatch_asyns或者什么吗?
答案 4 :(得分:0)
听起来你正在从后台线程调用-pushViewController
。所有UI活动都必须在主线程上进行。
解决此问题的一种简单方法是:
[self.navigationController performSelectorOnMainThread:@selector(pushViewController) withObject:controller]
这将导致-pushViewController
在主线程中执行。