[SwiftUI] Terminating app due to uncaught exception ‘NSInternalInconsistencyException 오류 해결방법
[오류 내용]
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
* Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.’ |
* First throw call stack:
(
0 CoreFoundation 0x00007fff2043a126 __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007fff20177f78 objc_exception_throw + 48
2 CoreAutoLayout 0x00007fff58010d41 -[NSISEngine tryToOptimizeReturningMutuallyExclusiveConstraints] + 0
3 CoreAutoLayout 0x00007fff58010fcd -[NSISEngine withBehaviors:performModifications:] + 25
4 UIKitCore 0x00007fff24ab9bdc -[UIView(UIConstraintBasedLayout) _resetLayoutEngineHostConstraints] + 70
5 UIKitCore 0x00007fff24bbd92f -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2715
6 QuartzCore 0x00007fff27a3dd87 -[CALayer layoutSublayers] + 258
7 QuartzCore 0x00007fff27a44239 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 575
8 QuartzCore 0x00007fff27a4ff91 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 65
9 QuartzCore 0x00007fff27990078 _ZN2CA7Context18commit_transactionEPNS_11TransactionEdPd + 496
10 QuartzCore 0x00007fff279c6e13 _ZN2CA11Transaction6commitEv + 783
11 QuartzCore 0x00007fff279c7616 _ZN2CA11Transaction14release_threadEPv + 210
12 libsystem_pthread.dylib 0x00007fff5dcda054 _pthread_tsd_cleanup + 551
13 libsystem_pthread.dylib 0x00007fff5dcdc512 _pthread_exit + 70
14 libsystem_pthread.dylib 0x00007fff5dcd9ddd _pthread_wqthread_exit + 77
15 libsystem_pthread.dylib 0x00007fff5dcd8afc _pthread_wqthread + 481
16 libsystem_pthread.dylib 0x00007fff5dcd7b77 start_wqthread + 15
)
[오류원인]
메인 스레드에서 액세스한 후 백그라운드 스레드에서 레이아웃 엔진에 대한 수정을 시도하는 경우 발생하는 오류이다.
[해결방법]
백그라운드 스레드에서 에러가 발생한 코드를 DispatchQueue.main.async 로 감싸주면 오류는 해결된다.
DispatchQueue.main.async{
// your code here
}
iOS 13에서 iOS 14의 넘어가면서 나타난 변화로 보이며, 원인은 애니메이션 그룹을 설정하기 위해 파견된 백그라운드 스레드 였다. 애니메이션 그룹의 설정 기능이 백그라운드 유틸리티 스레드에서 실행되고 있었다. (실제로 이해할 수 없는 이유로). 백그라운드 스레드로의 디스패치를 제거하여 문제를 해결했다.