2016-09-30 7 views
4

私はviewControllerにいくつかのデフォルトイメージを持っていて、ユーザーアクションの後に、外部イメージをロードしてデフォルトイメージを置き換えます。私は他の1UIImage refresh swift3

DispatchQueue.main.async { 
      self.getDataFromUrl(thumbURL, completion: { (data) in 
         let image = UIImage(data: data!) 
         self.cityImageView.image = image 
         print("img refreshed") 
       }) 
      } 

func getDataFromUrl(_ url:String, completion: @escaping ((_ data: Data?) -> Void)) { 
     URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { (data, response, error) in 
      if let newData = data { 
       completion(newData) 
      } 
     }) .resume() 
    } 

へのViewControllerを変更しない限り

問題は、それは私が何をしないのですだから私は、img refreshedをプリントを出すが、何も変わりませんフロントエンドで画像が、doesntのリフレッシュをロードしますか?

答えて

3

メインスレッドでイメージを設定できますか?

DispatchQueue.main.async { 
    self.getDataFromUrl(thumbURL, completion: { (data) in 
     DispatchQueue.main.async { 
      let image = UIImage(data: data!) 
      self.cityImageView.image = image 
      print("img refreshed") 
     } 
    }) 
} 
+0

ありがとう、それでも動作しますが、それでもなぜダブルメインスレッドですか? –

+0

そうですが、最初のGCDメインを削除できます。私はメソッドがサブスレッドで実行されると思います。クロージャーでメインスレッドを呼び出すだけです。 – Stark

+0

私はあなたのコードをコピーして、それがUIKitを含むので、メインスレッドに補完ブロックを配置しました。なぜ最初の発送が必要なのか分かりません。 @starkがコメントしたように、あなたはおそらくそれを必要としません。 –

0

GCDキューに入れる必要はありません。

完了ブロックはデリゲートキュー(この場合はメインキュー)で実行されます。メモリリークを避けるためにキャプチャリストを定義する必要があることに気づくだけです。

self.getDataFromUrl(imageURL, completion: { [unowned self] (data) in 
       let image = UIImage(data: data!) 
       self.imageView.image = image 
       print("img refreshed") 
      }) 

func getDataFromUrl(_ url:String, completion: @escaping ((_ data: Data?) -> Void)) { 

     URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { (data, response, error) in 
      if let newData = data { 
       completion(newData) 
      } 
     }) .resume() 
    } 

問題が修正された場合はお知らせください。