Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios -只能从主线程调用[UIApplication delegate]_Ios_Multithreading_Cocoa Touch_Thread Safety_Uiapplication - Fatal编程技术网

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

Ios -只能从主线程调用[UIApplication delegate],ios,multithreading,cocoa-touch,thread-safety,uiapplication,Ios,Multithreading,Cocoa Touch,Thread Safety,Uiapplication,这个警告导致了一个严重的问题,因为我真的无法使用Xcode 9 beta 2在主线程之外调用委托。奇怪的是,当我在使用Xcode 8.3.3时,这个功能就正常工作了 我还认为只从主线程调用代表是一种很好的做法,不是吗?那么为什么这会导致应用程序现在崩溃呢?只需像这样从主线程调用它 目标-C dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication delegate] fooBar]; }); Swift DispatchQue

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


我还认为只从主线程调用代表是一种很好的做法,不是吗?那么为什么这会导致应用程序现在崩溃呢?

只需像这样从主线程调用它

目标-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()
}

显然你是从另一个线程来做的。如果您不共享某些代码,我们将无法帮助您。代码正常工作并不意味着它是正确的。对于线程问题,它可能“工作”9999/10000次,但最后一次失败通常会发生在审阅者手中还要检查堆栈跟踪,确定它是您的代码,而不是某个第三方库。只是想知道您所说的架构清理到底是什么意思。比如说,我引用了CoreData使用的当前上下文。我通过AppDelegate访问它。我应该把它放在哪里呢?您可以创建一个单独的对象来包装所有的CoreData代码。然后将该对象(依赖项注入)传递给需要它们的视图控制器。此处的“体系结构清理”指的是,您几乎不应该在代码中的任何地方引用
[[UIApplication sharedApplication]委托]
。应用程序委托是UIApplication的委托。它不是全球存储的垃圾场。如果你想让一个单件保存你在这里保存的任何东西,那么创建一个新的单件。您的应用程序委派代码通常应该相当短,并且只关注应用程序状态转换,而不是存储您的模型。(这是一个笑话,未来的读者谁是不确定的iOS。)万分感谢你救了我一天:)