我正在關注使用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來獲得主線程是否必要,我將非常感激。
你有沒有看看[Alamofire自述文件](https://github.com/Alamofire/Alamofire)? - 「默認情況下,響應處理程序在主調度隊列上執行....」 –
@MartinR感謝您的評論。我實際上並沒有這樣做,這意味着在這種情況下,在更新UI時不需要DispatchQueue.main?我仍然對這個東西不熟悉。 – aresz
你不需要。你可以通過'dispatch_get_current_queue()== dispatch_get_main_queue()' –