Ios 从主线程访问布局引擎后,不得从后台线程执行对布局引擎的修改

Ios 从主线程访问布局引擎后,不得从后台线程执行对布局引擎的修改,ios,ios-autolayout,Ios,Ios Autolayout,在将现有的UIViewController转换为自动布局后,我遇到了此崩溃,我无法找出是什么导致了它。我确实搜索了dispatch\u async(dispatch\u get\u global\u queue(…)调用,但没有更改布局 堆栈跟踪也没有什么帮助: * thread #18: tid = 0x73617, 0x0000000183aa8524 libobjc.A.dylib`objc_exception_throw, stop reason = breakpoint 3.1 *

在将现有的
UIViewController
转换为自动布局后,我遇到了此崩溃,我无法找出是什么导致了它。我确实搜索了
dispatch\u async(dispatch\u get\u global\u queue(…)
调用,但没有更改布局

堆栈跟踪也没有什么帮助:

* thread #18: tid = 0x73617, 0x0000000183aa8524 libobjc.A.dylib`objc_exception_throw, stop reason = breakpoint 3.1
  * frame #0: 0x0000000183aa8524 libobjc.A.dylib`objc_exception_throw
    frame #1: 0x0000000185071100 CoreFoundation`+[NSException raise:format:] + 116
    frame #2: 0x0000000185c83894 Foundation`_AssertAutolayoutOnAllowedThreadsOnly + 192
    frame #3: 0x0000000185c835d4 Foundation`-[NSISEngine _optimizeWithoutRebuilding] + 76
    frame #4: 0x0000000185aceddc Foundation`-[NSISEngine optimize] + 112
    frame #5: 0x0000000185c82270 Foundation`-[NSISEngine performPendingChangeNotifications] + 112
    frame #6: 0x000000018af23e18 UIKit`-[UIView(Hierarchy) layoutSubviews] + 220
    frame #7: 0x000000018b15fff8 UIKit`-[UISlider layoutSubviews] + 192
    frame #8: 0x000000018af23a80 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1196
    frame #9: 0x00000001883d19d8 QuartzCore`-[CALayer layoutSublayers] + 148
    frame #10: 0x00000001883c64cc QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 292
    frame #11: 0x00000001883c638c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
    frame #12: 0x00000001883433e0 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 252
    frame #13: 0x000000018836aa68 QuartzCore`CA::Transaction::commit() + 512
    frame #14: 0x000000018836af34 QuartzCore`CA::Transaction::release_thread(void*) + 660
    frame #15: 0x0000000184103fbc libsystem_pthread.dylib`_pthread_tsd_cleanup + 572
    frame #16: 0x0000000184103ce4 libsystem_pthread.dylib`_pthread_exit + 200
    frame #17: 0x0000000184103378 libsystem_pthread.dylib`_pthread_wqthread + 1504
    frame #18: 0x0000000184102d8c libsystem_pthread.dylib`start_wqthread + 4
(lldb)

有没有办法找出触发布局的确切位置?

在再次查看堆栈跟踪后,我终于找到了问题所在。问题是我在后台线程上更改了
UISlider
实例的
value
属性


但是它没有说明你必须在主线程上更改它!(谢谢,苹果)显然,它似乎是
UISlider
实现了
值的setter,并强制布局或类似的东西。

始终在UI上进行更改应该在主线程上进行。另外一个重要的主题是你可以从背景线程的视图中创建一个对象!!!但对于show-in-view或其他关于它的更改,应该是工作的主线程,而这个主题是出现这个问题的主要原因

最后,为了解决这个问题,您可以很容易地使用“DispatchQueue”

DispatchQueue.main.async{
//做你的工作
}

您的主线程发生冲突,或者任何其他进程正在中断主线程,因此请在(time,dispatch\u get\u main\u queue(),{})您在后台线程中制作一些动画后在side grand dispatch中调用您的方法。@Sergey,我认为这不是问题所在,如果是这样的话,在自动布局之前,它们也不会工作。谢谢-从错误消息中可以看出这不是问题所在-阅读您的回复后,我发现我在后台线程上打开了一个模式对话框-在iOS 12中没有问题,但在iOS 13中崩溃了我的应用谢谢,@Nostrandamus我刚刚在主线程中添加了我的代码,它成功了<代码>调度异步(调度获取主队列(),^{//code})
奇怪的是,它只在IOS 13中崩溃,而不是在IOS 12中崩溃。@MacMark,是的,现在有点明显,但我认为出于某种原因,它不会回到2017年。