2017-07-11 11 views
1

This is Question Videoすぐに迅速

によって私はSDWebImageを使用して、ImageViewのについて問題を抱えています。
私はユーザーのイメージを変更し、すでに新しいユーザーのイメージURLを取得していますが、このViewControllerにプッシュすると、古いイメージが最初に表示され、新しいイメージに変更されます。
私の何が悪いですか?おかげさまで

var avatar:String = "" // previous VC data pass to here 

var photoImageView:UIImageView = {() -> UIImageView in 
    let ui = GeneratorImageView() 
    ui.backgroundColor = UIColor.clear 
    ui.layer.masksToBounds = true 
    ui.contentMode = .scaleAspectFill 
    return ui 
}() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    iconImageFromUrl(imageView: iconImageView, url: avatar, isResize: false) 
}  


func iconImageFromUrl(imageView:UIImageView, url:String,isResize:Bool) { 

imageView.setShowActivityIndicator(true) 
imageView.setIndicatorStyle(.gray) 

imageView.sd_setImage(with: URL(string:url), placeholderImage: nil, options: .lowPriority, progress: nil 
    , completed: { (image, error, cacheType, url) in 

     guard image != nil else{ 
      imageView.image = resizeImage(image: #imageLiteral(resourceName: "defaultIcon"), newWidth: 50) 
      return 
     } 

     DispatchQueue.global().async { 
      let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check/try-catch 

      if data != nil 
      { 
       if let image = UIImage(data: data!) 
       { 
        DispatchQueue.main.async { 

         if isResize == true{ 
          imageView.image = resizeImage(image: image, newWidth: 250) 
         }else{ 
          imageView.image = image 
         } 
        } 
       } 
      } 
     } 
}) 
} 

答えて

2

sd_setImage方法はUIImageViewのカテゴリ内に記述されます。イメージをダウンロードすると、イメージはUIImageviewに設定され、完了クロージャでは、ダウンロード/キャッシュされたUIImageも返されます。

データをimageUrlから作成してもう一度設定する必要はありません。イメージのサイズを変更する場合は、返されたイメージ上でイメージを変更できます。

また、デフォルトの画像を設定するための画像nilをチェックする必要がいけない、単にプレースホルダイメージとしてリサイズデフォルトの画像を渡す

imageView.sd_setImage(with: URL(string:url), placeholderImage: resizeImage(image: #imageLiteral(resourceName: "defaultIcon"), newWidth: 50), options: .lowPriority, progress: nil 
, completed: { (image, error, cacheType, url) in 
    guard image != nil else { 
     return 
    } 

    if isResize { 
      imageView.image = resizeImage(image: image, newWidth: 250) 
    } }) 
+0

私はIMAGEURLを取得するために、非同期APIを呼び出すので、それが起こるのだろうビューが表示され、画像は変化しません。 – Beginnerrrrrr

+0

@Beginnerrrrrr:はい、あなたは正しいです。ここでの問題は、SDWebImageCacheによって毎回イメージがキャッシュ/メモリからロードされた後のresizeImageです。それまでは画像を表示しないように選択できますが、毎回画像のサイズ変更の問題は解決しません。必要に応じて、画像URLにクエリーパラメータとしてwidthを追加して、サイズ変更された画像をSDWebImageCacheに保存することができます。 –