示例 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 时,为什么我的应用程序崩溃了。
Quest2:- main.async 和 global().async 有什么区别吗?
最佳答案
简单来说,我得出的结论是——
- 队列- 有 3 种类型的队列,即 1 种主队列、4 种全局队列和任意数量的自定义队列。
- Threads- 一个是主线程和其他系统后台线程 提供给我们。
DispatchQueue.main.async
-这意味着使用后台线程(不阻塞 UI)在主队列中执行任务,当任务完成时自动更新到 UI,因为它已经在主队列中。
DispatchQueue.global().async 和 global().sync
这意味着使用后台线程在全局队列中执行任务,当任务完成时,global().sync 使用将工作从 globalQueue 带到 mainQueue 更新到用户界面。
我的应用崩溃的原因
我试图通过使用 (main.sync) 将完成的任务带到 MainQueue,但它已经在 MainQueue 上,因为我没有切换队列,并且这个创建死锁(MainQueue 等待它自己), 导致我的应用程序崩溃
关于ios - Swift3 GCD 中的 main.async vs main.sync() vs global().async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732016/