示例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) } }
据我所知
任务1:-为什么在后台线程(即main.async)中执行任务时,我的应用程序崩溃了,而不是调用主线程来更新UI。
任务2:-main.async和global()。async是否有任何区别。
简单来说,我得出的结论是-
DispatchQueue.main.async
-这意味着使用后台线程(不阻止UI)在主队列中执行任务,并且在任务完成时自动将其更新为UI,因为它已经在主队列中。
DispatchQueue.global()。async和global()。sync
这意味着使用后台线程在Global Queue中执行任务,并且当任务完成时,而不是 global()。sync的 使用将工作从 globalQueue转移到mainQueue ,然后更新到UI。
我的应用崩溃的原因
我试图使用(main.sync)将完成的任务带到MainQueue,但是它已经在MainQueue上,因为我没有切换队列,并且此 创建DeadLock (MainQueue等待自身)导致我的应用程序崩溃