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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...