app从后台线程修改autolayout引擎

时间:2016-12-19 06:53:31

标签: ios swift multithreading task-queue dispatch

我差不多将我的iOS应用程序迁移到Swift 3.0。 但我仍然有一些类似于下面的情况。 其中大多数我都能通过将有问题的代码放在主线程上来解决。

在其他一些情况下,我无法弄清楚,我的代码的哪一部分正在错误的线程上执行。我收到这样的消息:

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.
 Stack:(
    0   CoreFoundation                      0x000000018765a1d8 <redacted> + 148
    1   libobjc.A.dylib                     0x000000018609455c objc_exception_throw + 56
    2   CoreFoundation                      0x000000018765a108 <redacted> + 0
    3   Foundation                          0x0000000188241ea4 <redacted> + 192
    ....................
    16  libsystem_pthread.dylib             0x00000001866eece4 <redacted> + 200
    17  libsystem_pthread.dylib             0x00000001866ee378 pthread_mutex_lock + 0
    18  libsystem_pthread.dylib             0x00000001866edda4 start_wqthread + 4
)

是否有一些特殊的技术(使用调试器或选项时的选项)我可以用来跟踪progran所遵循的路径,看看这发生了什么?

2 个答案:

答案 0 :(得分:5)

显然,你在后台线程上做了一些UI更新。如果没有看到您的代码,就无法准确预测到哪里。

可能会发生以下情况: -

  1. 您可能正在后台线程上执行某些操作而不使用。在相同的功能中,这个代码更容易被发现。

    DispatchQueue.main.async { // do UI update here }
    
  2. 在后台线程上调用func进行Web请求调用,并调用其他func执行ui更新的完成处理程序。

  3. 要解决这个问题,请尝试检查webrequest调用后更新UI的代码。

     // Do something on background thread
    DispatchQueue.global(qos: .userInitiated).async {
       // update UI on main thread
       DispatchQueue.main.async {
                    // Updating whole table view
                    self.myTableview.reloadData()
                }
    }
    

答案 1 :(得分:1)

我认为没有任何其他内置工具可用于调试此类崩溃,因为它是从代码中修改AutoLayout UI元素/约束的代码,该代码在后台线程或完成处理程序中运行。默认情况下,所有完成处理程序都在后台线程中运您需要使用GCD更新完成处理程序块中的UI元素。