2016-12-14 5 views
0

私はREST/web requestsでの作業に関するチュートリアルに従っています。チュートリアルでは、我々はAlamofireを使用してAPIからポケモンの詳細を取得ポケモンずかんアプリに向けて作業している、そして私たちのUIでそのデータを表示します。ここでAlamofireリクエスト後にUIを更新するためにDispatchQueue.mainが必要ですか?

は、関連するコードは次のとおりです。

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を使ってメインスレッドを取得する必要があるかどうかについては、私は非常に感謝しています。 1は全体のコメント欄を読みたくない場合は

+2

はあなたをしました[Alamofire Readme](https://github.com/Alamofire/Alamofire)をご覧ください。 - "デフォルトで応答ハンドラがメインディスパッチキューで実行されます...." –

+0

@MartinRコメントをいただきありがとうございます。私は実際には行っていませんが、この場合、UIを更新するときにDispatchQueue.mainは必要ないということですか?私はまだこのものに新しいです。 – aresz

+1

あなたは必要ありません。これは 'dispatch_get_current_queue()== dispatch_get_main_queue()'で確認できます。 –

答えて

7

、私はそれが答えとしてここに掲載しています。 まず、明確に述べてAlamofire docs、読んで:「デフォルトでレスポンスハンドラメインディスパッチキュー上で実行されている」

これは、応答ブロックで任意のUI関連コードを呼び出すことができることを意味します。 Xcodeの9から始まっXcodeの9

がビルトインされてMain Thread Checker

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

:あなたはまだサードパーティ製のlibのドキュメントに頼ることが不快に感じる場合は、このswift3スニペットを実行することで確認することができますAppKit、UIKit、およびその他のAPIの無効な使用をバックグラウンドスレッドから検出します。 Main Thread Checkerは、Xcodeデバッガでアプリケーションを実行すると自動的に有効になります。

プロジェクトのいずれかの部分がバックグラウンドスレッドから無効なUIコールが含まれている場合は、次のように表示されます。

Xcodeのバージョン9.1(9B55)で実証

enter image description here

**

関連する問題