-[UIApplication delegate] 只能从主线程调用

-[UIApplication delegate] must be called from main thread only

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

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

像这样从主线程调用它。

Objective-C

dispatch_async(dispatch_get_main_queue(), ^{
  [[UIApplication delegate] fooBar];
});

Swift

DispatchQueue.main.async {
  YourUIControlMethod()
}

像这样联系您的应用代表,暗示您的架构需要稍微清理一下。

您可以从任何线程调用委托。您只需要确保您在 UIKit 调用的 主线程上。 或者您在 CoreData 对象期望的正确线程上。这完全取决于您的对象所拥有的 API 合同。

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

DispatchQueue.main.async {
    YourUIControlMethod()
}