“Only run on the main thread” exception is simulat

2019-06-15 13:27发布

I'm getting a "only run on the main thread" exception somewhere deep inside (or after)

[self.navigationController pushViewController:controller animated:YES];

The thing is it only happens on Simulator and not while debugging in an IOS device.
Any chance I can work around this?

The dump:

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

5条回答
倾城 Initia
2楼-- · 2019-06-15 13:54

It sounds like you are calling -pushViewController from a background thread. All UI activity has to happen on the main thread.

One simple way to solve this is:

[self.navigationController performSelectorOnMainThread:@selector(pushViewController) withObject:controller]

That will cause -pushViewController to be executed in the main thread.

查看更多
放我归山
3楼-- · 2019-06-15 14:00

Code for same in Swift.

dispatch_async(dispatch_get_main_queue()){
        self.navigationController?.setViewControllers([viewController], animated: true)

    }
查看更多
叛逆
4楼-- · 2019-06-15 14:07

The reason is using calling that code from different thread. Do you try some dispatch_asyns or something?

查看更多
啃猪蹄的小仙女
5楼-- · 2019-06-15 14:14

in swift 3.0 or later

DispatchQueue.main.async(){
   //write your code
 }
查看更多
Ridiculous、
6楼-- · 2019-06-15 14:16

Please do your UI callbacks from the main thread. You must NEVER update your UI from a background thread.

Do your UI updates like so, using Grand Central Dispatch:

dispatch_async(dispatch_get_main_queue(), ^{
    /* Your UI code */
});
查看更多
登录 后发表回答