SwiftUI

[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의 넘어가면서 나타난 변화로 보이며, 원인은 애니메이션 그룹을 설정하기 위해 파견된 백그라운드 스레드 였다. 애니메이션 그룹의 설정 기능이 백그라운드 유틸리티 스레드에서 실행되고 있었다. (실제로 이해할 수 없는 이유로). 백그라운드 스레드로의 디스패치를 제거하여 문제를 해결했다.
 

 

Leave a Reply

error: Content is protected !!