2014-03-25 4 views
11

Ich erhalte eine irgendwo tief im Inneren Ausnahme „nur auf dem Haupt-Thread ausgeführt werden“ (oder nach)„Nur auf dem Haupt-Thread ausgeführt“ Ausnahme ist Simulator nur

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

Die Sache ist es geschieht nur auf Simulator und nicht während des Debuggens in einem IOS-Gerät.
Jede Chance, dass ich das umgehen kann?

Der 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 
+0

Die Fragen und Antworten uns nicht wirklich helfen, aber Ihre Anmerkung an es nur im Simulator laufen war ziemlich hilfreich. Ich hatte eine ähnliche Fehlermeldung, während ich im Simulator lief, aber es lief auf dem tatsächlichen Gerät gut. – TenaciousJay

Antwort

27

Bitte führen Sie Ihre Benutzeroberflächenrückrufe vom Hauptthread aus. Sie müssen nie aktualisieren Sie Ihre UI von einem Hintergrund-Thread.

Sie Ihre UI Updates wie so, mit Grand Central Dispatch:

dispatch_async(dispatch_get_main_queue(), ^{ 
    /* Your UI code */ 
}); 
0

Der Grund aus anderen Thread, dass Code aufruft. Probieren Sie einige dispatch_asyns oder etwas?

0

Es klingt wie Sie -pushViewController aus einem Hintergrund-Thread aufrufen. Alle UI-Aktivitäten müssen im Hauptthread stattfinden.

Eine einfache Möglichkeit, dies zu lösen ist:

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

Das verursacht -pushViewController im Hauptthread ausgeführt werden.

3

Code für das gleiche in Swift.

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

    } 
2

in swift 3.0 oder höher

DispatchQueue.main.async(){ 
    //write your code 
} 
Verwandte Themen