2016-12-14 49 views
0

我正在关注使用REST/web requests的教程。在本教程中,我们正在努力应用Pokedex应用程序,在该应用程序中,我们使用Alamofire从API中获取Pokemon的详细信息,然后在我们的UI中显示该数据。在Alamofire请求之后,我是否需要DispatchQueue.main来更新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.和更新UI有像这样?

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

教程离开它了,我不知道这里需要DispatchQueue更新UI。我知道在后台线程中更新UI是不好的做法,所以如果任何人都可以阐明在这里使用DispatchQueue来获得主线程是否必要,我将非常感激。

+2

你有没有看看[Alamofire自述文件](https://github.com/Alamofire/Alamofire)? - “默认情况下,响应处理程序在主调度队列上执行....” –

+0

@MartinR感谢您的评论。我实际上并没有这样做,这意味着在这种情况下,在更新UI时不需要DispatchQueue.main?我仍然对这个东西不熟悉。 – aresz

+1

你不需要。你可以通过'dispatch_get_current_queue()== dispatch_get_main_queue()' –

回答

7

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

这意味着,您可以在响应块中调用任何与UI相关的代码。如果你还是觉得不舒服依靠第三方的lib文档,你可以通过执行此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)

相关问题