示例 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
?
简而言之,我得出的结论是——
-
Queue- 有 3 种类型的队列,即 1 个主队列、4 个全局队列和任意数量的自定义队列。
-
Threads- 一个是系统的主线程和其他后台线程
提供给我们。
DispatchQueue.main.async
-这意味着使用后台线程在主队列中执行任务(不阻塞 UI),并且当任务完成时,它会自动更新到 UI,因为它已经在主队列中。
DispatchQueue.global().async 与 global().sync
这意味着使用后台线程在全局队列中执行任务,当任务完成时,比全局().sync使用来自的工作全局队列到主队列更新到 UI。
我的应用程序崩溃的原因
我试图通过使用(main.sync)将完成的任务带到MainQueue,但它已经在MainQueue上,因为我没有切换队列,并且这个创建死锁(MainQueue 等待自身),导致我的应用程序崩溃
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)