这个警告导致了一个严重的问题,因为我在使用 Xcode 9 beta 2 时无法在主线程之外调用代理。奇怪的是,在使用 Xcode 8.3.3 时,这个功能是有效的。
而且我认为只从主线程调用代理是良好的实践,不是吗?那么为什么现在会导致应用程序崩溃呢?
这个警告导致了一个严重的问题,因为我在使用 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合同。
[[UIApplication sharedApplication] delegate]
。应用程序代理是 UIApplication 的代理,而不是全局存储的临时场所。如果您想要一个单例来保存您正在保存的内容,请创建一个新的单例。您的应用程序代理代码通常应该很短,并且只关注应用程序状态转换,而不是存储模型。 - Rob Napier在 Swift 中,您还可以使用 DispatchQueue.main.async
从主线程调用 UI 控制方法。
DispatchQueue.main.async {
YourUIControlMethod()
}