2016-05-19 7 views
1

私はセル内にイメージを表示するtableViewを持っています。ほとんどの場合、正しい画像が表示されますが、間違った画像が表示されることがあります(通常、tableViewをすばやくスクロールすると通常は表示されます)。イメージを非同期でダウンロードします。UITableViewセル内のurlからの非同期イメージの読み込み - スクロール中に間違ったイメージのロード

cell.profImg.getImgFromUrl(link: man.img, contentMode: cell.profImg.contentMode) 

そして、ここで私は、非同期要求を行います。

extension UIImageView { 
func getImgFromUrl(link link:String, contentMode mode: UIViewContentMode) { 
    guard 
     let url = NSURL(string: link) 
     else {return} 
    contentMode = mode 
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in 
     guard 
      let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200, 
      let mimeType = response?.MIMEType where mimeType.hasPrefix("image"), 
      let data = data where error == nil, 
      let image = UIImage(data: data) 
      else { return } 
     dispatch_async(dispatch_get_main_queue()) {() -> Void in 
      self.image = image 
     } 
    }).resume() 
    } 
} 
+1

速いスクロールでは、非同期リクエストが終了するまでにセルがデキューされ、別のセルに再利用される可能性があるため、間違ったセルが更新されるという問題があると思います。 – Wolverine

+0

自己画像とは何ですか?あなたがこれを使う時? – Lion

+0

あなたはswiftを使用していますので、画像の遅延読み込みのためにhttps://github.com/onevcat/Kingfisherライブラリを使用することをお勧めします。 – Wolverine

答えて

1

私はあなたがあなたのHTTPイメージのロードを開始するとき、あなたのUIImageViewの内容はリセットされませんので、それはだと思います。したがって、セルが再利用されると、以前にロードされたイメージが表示されます。

(空白の画像が必要な場合)またはself.image = myPlaceholderImage(読み込み中にプレースホルダ画像が必要な場合)のように開始する必要があります。

extension UIImageView { 
    func getImgFromUrl(link link: String, contentMode mode: UIViewContentMode) { 
     guard 
     self.image = nil // Here you can put nil to have a blank image or a placeholder image 
     let url = NSURL(string: link) 
     else { return } 
     contentMode = mode 
     NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in 
      guard 
      let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200, 
       let mimeType = response?.MIMEType where mimeType.hasPrefix("image"), 
       let data = data where error == nil, 
       let image = UIImage(data: data) 
      else { return } 
      dispatch_async(dispatch_get_main_queue()) {() -> Void in 
       self.image = image 
      } 
     }).resume() 
    } 
} 

しかし、私はあなたがSDWebImageの使用を検討すべきだと思う:ここにあなたのコードでそれを統合する方法です。このライブラリは、WebからのリモートイメージをサポートするUIImageViewのカテゴリを提供します。それはずっと効率的で簡単です。

関連する問題