如何解决Swift3 GCD中的main.async vs main.syncvs globalasync
简单来说,我得出的结论是-
- -有3种类型的队列,即1个主队列,4个全局队列和任意数量的自定义队列。
- -系统提供给我们的是主线程和其他后台线程。
-这意味着使用后台线程(不阻止UI)在主队列中执行任务,并且在任务完成时自动将其更新为UI,因为它已经在主队列中。
这意味着使用后台线程在Global Queue中执行任务,并且当任务完成时,而不是 使用将工作从 ,然后更新到UI。
我试图使用(main.sync)将完成的任务带到MainQueue,但是它已经在MainQueue上,因为我没有切换队列,并且此 (MainQueue等待自身)导致我的应用程序崩溃
解决方法
示例A:-这会导致应用崩溃。
DispatchQueue.main.async {
let url = URL(string: imageUrl)
do {
let data = try Data(contentsOf: url!)
DispatchQueue.main.sync {
self.imageIcon.image = UIImage(data: data)
}
}
范例B:-但事实并非如此
DispatchQueue.global().async {
let url = URL(string: imageUrl)
do {
let data = try Data(contentsOf: url!)
DispatchQueue.main.sync {
self.imageIcon.image = UIImage(data: data)
}
}
据我所知
- x.sync表示在主线程/ UI线程中执行操作,x.async表示在后台线程中执行操作。
- 全局意味着用并发队列执行某些任务,即并行任务。
任务1:-为什么在后台线程(即main.async)中执行任务时,我的应用程序崩溃了,而不是调用主线程来更新UI。
任务2:-main.async和global()。async是否有任何区别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。