2016-12-19 33 views
-1

我几乎完成了将我的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是否有一些特殊的TECHNIC,看到这里发生这种情况?

+0

看一看这样的:http://stackoverflow.com/a/39712843/1208191 –

回答

1

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

+0

你叫什么“GCD”在这种情况下?也许是一个新手问题? – Michel

+0

它基本上是调度队列(大中央调度)。使用调度队列主。 –

+0

好的。我解决了这个问题,首先在主线上放置了我在BG线上留下的唯一东西,然后剥下来。 – Michel

5

显然你正在做一些关于背面线程的UI更新。无法预测您的代码,确切地说在哪里。

这些都是某些情况下,可能会发生: -

  1. ,你可能会做在后台线程的东西和不使用。在相同的功能,这个代码更容易发现。

    DispatchQueue.main.async { // do UI update here } 
    
  2. 调用func在后台线程做网页请求和呼叫其完成处理程序调用其他func做UI更新。

解决这个尝试检查在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() 
      } 
} 
相关问题