我是否需要 DispatchQueue.main 在 Alamofire 请求后更新 UI?

2024-02-02

我正在学习有关使用的教程REST/web requests。在本教程中,我们正在开发一个 Pokedex 应用程序,我们使用 API 从 API 获取 Pokemon 详细信息Alamofire,然后在我们的 UI 中显示该数据。

这是相关代码:

typealias DownloadComplete = (Bool) -> ()

// Model class
func downloadPokemonDetails(completed: @escaping DownloadComplete)
    {
        Alamofire.request(_pokemonURL).responseJSON { (response) in
            var success = true
            if let jsonData = response.result.value as? Dictionary<String, Any>
            {
                // parse the json here
                ...
            }
            else
            {
                success = false
            }
            completed(success)
        }
    }

// Controller class
override func viewDidLoad() {
        super.viewDidLoad()
        pokemon.downloadPokemonDetails(completed: { (success) in
            if success
            {
                self.updateUI()
            }
            else
            {
                print("FAILED: TO PARSE JSON DATA")
            }
        })
    }

func updateUI()
{
    attackLbl.text = pokemon.attack
    defenseLbl.text = pokemon.defense
    heightLbl.text = pokemon.height
    weightLbl.text = pokemon.weight
}

现在我的问题是:我们不应该使用DispatchQueue.main.并像这样更新用户界面?

pokemon.downloadPokemonDetails(completed: { (success) in
            if success
            {
                DispatchQueue.main.async {
                    self.updateUI()
                }
            }

该教程遗漏了它,我不确定是否DispatchQueue此处需要更新 UI。我知道在后台线程中更新 UI 是一种不好的做法,因此如果有人可以阐明是否有必要在此处使用 DispatchQueue 来获取主线程,我将非常感激。


如果有人不想阅读整个评论部分,我将其发布在这里作为答案。 首先,阅读阿拉莫火文档 https://github.com/Alamofire/Alamofire,其中明确指出:“默认情况下,响应处理程序在主调度队列上执行。”

这意味着,您可以在响应块中调用任何与 UI 相关的代码。如果您仍然对依赖第 3 方 lib 文档感到不舒服,可以通过执行以下命令进行检查swift3片段:

if Thread.isMainThread { 
   print("Main Thread") 
}

xcode 9

从...开始xcode 9有一个内置的Main Thread Checker它从后台线程检测 AppKit、UIKit 和其他 API 的无效使用。Main Thread Checker当您使用 Xcode 调试器运行应用程序时,会自动启用。

如果项目的任何部分包含来自后台线程的无效 UI 调用,您将看到以下内容:

** 在 Xcode 版本 9.1 (9B55) 中演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否需要 DispatchQueue.main 在 Alamofire 请求后更新 UI? 的相关文章

随机推荐

  • 如何确定Android .so文件的ABI(即armeabi或armeabi-v7a)?

    我有一个由第三方供应商提供的 so 文件 该文件将包含在我的 Android 应用程序中 我无法访问源代码 也无法 轻松 联系供应商 有没有办法让我通过检查 so 文件来确定它是否是针对armeabi or armeabi v7a ABI
  • 如何使用其他表中的列/字段对 PostgreSQL 表进行集群

    我想根据其他表中的信息对 PostgreSQL 表进行聚类 想象一下两张桌子 foos id baz id name and bars foo id name bars foo id是一个外键引用foos id 我想对 bar 表进行聚类
  • 我可以访问来自不同语言环境的 android 资源吗?

    我的应用程序中有两个区域设置 我可以访问资源 例如来自不同语言环境的字符串数组而不更改当前语言环境吗 我的意思是 对于编码 我不喜欢在 设置 中更改它 更好的解决方案是 如果您使用的是 API 17 NonNull protected St
  • 在包安装期间执行 R 脚本

    希望这有一个简单的答案 但我还没有找到它 我正在编写一个 R 包 当安装在 Windows 上时 我希望它执行一个搜索系统文件的脚本 即list files path C Program Files 然后将该路径保存到包目录作为文本文件以供
  • 使用 jquery 将 html 表格转为 excel

    我有这个有效的 jquery 函数 但我需要添加一些东西 我在桌子上设置了一个过滤器来隐藏列 当我隐藏列并单击导出时 它无论如何都会使用所有字段 如何只导出未隐藏的表列 var write to excel function var uri
  • 使用 ggplot 在 R 中创建堆积百分比条形图

    我一直在寻找一种方法 能够根据受访者的性别分类 将堆积条形图响应显示为百分比值 我成功地使用变量 性别 进行填充创建了堆积条形图 但我希望该图显示该变量之间的比例 我知道使用 count sum count 和 scale y 可以更改 y
  • 使用WCF上传文件

    我需要一个 WCF 服务来由用户上传大文件 以下哪一项提供了更优化的性能 OperationContract public void UploadFile Stream inputsreaam or OperationContract pu
  • 在 EF6 中将匿名类型转换为 IEnumerable<>

    我正在使用实体框架开发 MVC 应用程序 我想从表中获取 5 列并将它们返回到一个IE可枚举类型 我的代码是 IEnumerable
  • T-SQL 将日期时间修剪为最近的日期?

    重复的 删除日期时间值 SQL Server 的时间部分的最佳方法是什么 https stackoverflow com questions 2775 我有一个列 用于跟踪使用日期时间创建事物的时间 但我想生成一个按天分组的报告 因此我需要
  • R 中具有两个单独值的词云

    作为 R 新手 我正在制作一个显示两个变量的词云 frequency and rating 使用通用表格 我希望按州显示假设的大学数量 字体 数字从大到小 以及假设的平均大学评级 1 绿色 良好 3 黄色 平均 5 红色 坏 我能够创建这个
  • 当 CreatePackageOnPublish 设置为 true 时,TFS Team Build 中的长路径出现问题。

    由于 TFS Team Build 在参数设置时创建的长路径 我们在构建时遇到了问题发布时创建包被设定为true 在目录中软件包临时表 见后图 包被存储 但我不明白为什么这个目录结构是必要的以及如何定制它 问题是部署或新的 TFS 构建会因
  • 如何在 JNI 中从 C++ 调用 Java 方法

    所以我正在编写一个使用大型 C 库的 Android 应用程序 我已经一切正常 以便 java 应用程序可以调用 c 委托方法 但我发现自己希望可以将消息从 c 记录到 Android 日志中 这对于java来说很容易 但是我不知道如何从c
  • CSS 计算不适用于 宽度

    我想要Cell A为剩下的两个单元格留出 100px 的空间 我会想calc 100 100px 就足够了 因为这在许多其他情况下都可以正常工作 为什么这里不起作用 table width 100 border collapse colla
  • 我可以使用 Deref 从 Other 继承特征实现吗?

    我有一个String newtype https doc rust lang org rust by example generics new types html ErrorMessage我用它来解决原型箱中的错误 我知道这是一个不好的做
  • PyCharm:如何推断运行时创建的对象的类型

    我正在尝试使用一个创建对象的库 并在运行时将它们添加到全局命名空间 PyCharm 无法找到对对象的引用 因为它们最初不在命名空间中 如何让 PyC harm 内省不抱怨 找不到参考 我不想用noinspection tags 示例代码 为
  • JTextArea 中的文本更改事件?如何?

    我一直在尝试为我的文本更改事件处理机制JTextArea 出于我的目的 每当文本的文本发生变化时就必须触发一个事件JTextArea 我尝试使用KeyListener接口 这是我的代码 txtArea addKeyListener new
  • 通过 Win 10 Oct 2018 更新,Windows 可以感知闰秒。现在.NET 的DateTime 也是如此吗?

    2012年 这里有一个关于SO的问题 NET的DateTime是否能够识别闰秒 1 答案是否定的 文档仍然明确指出事实并非如此 2 但是 Windows Server 2019 和 Windows 10 October 2018 更新Win
  • 并发 JUnit 测试

    我有一个大型 JUnit 测试套件 我很想同时运行所有测试 原因有两个 利用多个核心更快地运行整个测试套件 希望能够检测到由于非线程安全全局对象而导致的一些错误 我认识到这将迫使我重构一些代码以使其线程安全 但我认为这是一件好事 让 JUn
  • 如何为 CORS 配置 Azure API 管理

    我已经创建了 Azure API 管理服务并连接了我的 API 我添加了CORS对他们的政策 我检查了计算有效政策结果就是这个政策
  • 我是否需要 DispatchQueue.main 在 Alamofire 请求后更新 UI?

    我正在学习有关使用的教程REST web requests 在本教程中 我们正在开发一个 Pokedex 应用程序 我们使用 API 从 API 获取 Pokemon 详细信息Alamofire 然后在我们的 UI 中显示该数据 这是相关代