- 必须仅从主线程调用[UIApplication委托]

ren*_*aku 35 multithreading cocoa-touch thread-safety uiapplication ios

这个警告导致一个严重的问题,因为我真的无法使用Xcode 9 beta 2在主线程之外调用委托.奇怪的是,当我使用Xcode 8.3.3时,这是有效的.

另外我认为只从主线程调用委托只是好习惯,不是吗?那么为什么这会导致应用程序崩溃呢?

ork*_*den 57

只需从主线程中调用它即可.

dispatch_async(dispatch_get_main_queue(), ^{
  [[UIApplication delegate] fooBar];
});
Run Code Online (Sandbox Code Playgroud)

像这样与您的应用代表联系,暗示您的架构可以使用一点清理.

您可以从任何您想要的线程调用代理.你只需要确保你在UIKit调用的主线程上.或者您正在使用CoreData对象所期望的正确线程.这完全取决于您的对象具有的API合约.

  • 这里的"体系结构清理"指的是你几乎不应该在代码中的任何地方引用`[[UIApplication sharedApplication]委托]`.app委托是*UIApplication的委托*.它不是全球存储的倾销场.如果你想让一个单身人士拿着你在这里拿着的东西,那就创建一个新的单身人士.您的应用委托代码通常应该相当短,并且只关注应用程序状态转换,而不是存储您的模型. (4认同)
  • 您需要制作包装所有CoreData代码的单独对象。然后,您将该对象传递给(依赖注入)给需要它们的视图控制器。 (2认同)

All*_*len 21

在Swift中,您还可以使用DispatchQueue.main.async从主线程调用UI控制方法

DispatchQueue.main.async {
    YourUIControlMethod()
}
Run Code Online (Sandbox Code Playgroud)