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

时间:2016-12-14 05:55:00

标签: ios swift alamofire grand-central-dispatch

我正在阅读有关使用REST/web requests的教程。在本教程中,我们正在开发一个Pokedex应用程序,我们使用Alamofire从API获取Pokemon详细信息,然后在我们的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是否有必要得到主线程,我会非常感激。

1 个答案:

答案 0 :(得分:13)

如果一个人不想阅读整个评论部分,我在这里发帖作为答案。 首先,阅读Alamofire docs,其中明确指出: &#34;默认情况下,响应处理程序在主调度队列上执行。&#34;

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

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

xcode 9

xcode 9 开始,内置Main Thread Checker可检测来自后台线程的AppKit,UIKit和其他API的无效使用。使用Xcode调试器运行应用程序时会自动启用Main Thread Checker

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

enter image description here

** 在Xcode版本9.1(9B55)

中演示