我正在学习有关使用的教程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(使用前将#替换为@)