一尘不染

Swift3 GCD中的main.async vs main.sync()vs global()。async

swift

示例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是否有任何区别。


阅读 381

收藏
2020-07-07

共1个答案

一尘不染

简单来说,我得出的结论是-

  • 队列 -有3种类型的队列,即1个主队列,4个全局队列和任意数量的自定义队列。
  • 线程 -系统提供给我们的是主线程和其他后台线程。

DispatchQueue.main.async

-这意味着使用后台线程(不阻止UI)在主队列中执行任务,并且在任务完成时自动将其更新为UI,因为它已经在主队列中。

DispatchQueue.global()。async和global()。sync

这意味着使用后台线程在Global Queue中执行任务,并且当任务完成时,而不是 global()。sync的 使用将工作从
globalQueue转移到mainQueue ,然后更新到UI。

我的应用崩溃的原因

我试图使用(main.sync)将完成的任务带到MainQueue,但是它已经在MainQueue上,因为我没有切换队列,并且此
创建DeadLock (MainQueue等待自身)导致我的应用程序崩溃

2020-07-07