2016-12-14 79 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)