我是否需要 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? 的相关文章

  • ios7 navigationController PushViewController 动画错误

    看来我在 navigationController PushViewController 方法中发现了一个错误 为了重新创建它 我采用了示例主详细信息项目并对 didSelectRow method void tableView UITab
  • AVCaptureSession 具有多个方向问题

    我正在尝试实现条形码扫描仪 我有一个 AVCaptureSession 它从 AVCaptureDevice 接收视频 我想支持所有方向 使用以下代码 当我运行应用程序时 纵向一切正常 然而 在横向方向上 视图会旋转 但视频输入不会旋转 所
  • Swift Codable 将空 json 解码为 nil 或空对象

    这是我的代码 class LoginUserResponse Codable var result String var data LoginUserResponseData var mess String public class Log
  • Parse.com 和 Facebook 登录,运行无限循环

    我将 Parse 和 Facebook iOS SDK 都更新到了最新版本 当我尝试使用 Facebook 登录时 我的应用程序崩溃了 从调试器中我可以看到它正在无限循环中调用 3 4 个方法 我的登录代码如下所示 void openSes
  • 用于字数计算的 Swift String 中的字数

    我想做一个程序来找出字符串中有多少个单词 用空格 逗号或其他字符分隔 然后把总数加起来 我正在制作一个平均计算器 所以我想要数据总数 然后将所有单词相加 update Xcode 10 2 x Swift 5 或更高版本 使用基础方法enu
  • iPhone UINavigationBar 使用 [UINavigationBar 外观] 更改所有控制器的字体样式

    我知道我可以单独更改导航栏的字体 如本答案所述 更改导航栏的字体 https stackoverflow com questions 5832036 change the navigation bars font 目前我正在使用一种更全局的
  • 在iOS上,“添加到主页”缓存保存在哪里,如何清除它?

    我正在 iPad iOS v7 上制作一个 html5 游戏 当我将其添加到主页时 它非常顽固地释放缓存 如果我在 Safari 中查看它 这会按照您所期望的方式工作 如果我刷新一次或两次 页面就会以最新状态缓存 但在主页上却是另一回事 它
  • iOS 滚动视图允许滚动过去的内容

    我正在努力优化我的应用程序以适应横向和较小的屏幕 我主要使用滚动视图来实现这一点 在我的其中一个视图中 我有一个容器视图 当我在故事板中的设备之间切换时 这个容器视图看起来很完美 容器视图映射到具有滚动视图的视图控制器 该滚动视图的顶部 底
  • 添加自定义过渡会导致 xib 加载错误的屏幕尺寸

    我正在尝试向具有 xib 的 UIViewController 添加自定义过渡 我尝试了几种方法 但它们都有相同的问题 视图显示的屏幕尺寸错误 我当前的示例基于以下教程 使用 Swift 在 iOS 中自定义 UIViewControlle
  • 以编程方式触发iOS摇动事件

    如何以编程方式触发 iOS 中的摇动事件 我尝试过以下方法 但它总是崩溃 void shake NSLog TEST UIMotionEventProxy m NSClassFromString UIMotionEvent alloc in
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • 在现有 iOS 应用程序中集成 React-native(0.40.0) 后找不到 Yoga/Yoga.h 头文件

    在我的 Swift iOS 应用程序中集成 React Native 后 我无法构建 yoga Yoga h file cannot be found 我已经浏览了文档 查看了react native github页面 检查了类似问题的SO
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • 苹果企业程序分发问题[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这个问题涉及到Apple iOS 开发者企业计划 http developer apple com programs ios enterprise 我
  • UIWebView Bug:-[UIWebView cut:]:无法识别的选择器发送到实例

    In the UIWebView 如果包含文本的输入元素具有焦点 并且按下按钮导致输入失去焦点 则随后双击输入以重新获得焦点并从出现的弹出栏中选择 剪切 或 复制 或 粘贴 会导致这UIWebView因错误而崩溃 UIWebView cut
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • init 中的 Swift 通用约束

    我有通用的 我希望能够用特定的约束来初始化它 约束仅用于初始化 班里的其他人并不关心 这是一个简化的示例 struct Generic
  • 分发内部业务 IOS 应用程序

    我遇到了 IOS 应用程序分发的一个令人困惑的部分 因此 我需要简单细分一下我的限制 即仅将我的应用程序分发给我的员工 同事或任何被视为 内部 的人 这是表明我不希望该应用程序出现在应用程序商店中的另一种方式 我的情况是我为几家公司开发 他
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController

随机推荐

  • 如何确定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 中显示该数据 这是相关代