2016-10-24 4 views
1

おはよう!非常に簡単な質問です。 dequeueReusableCellを使用してカスタムセルをバックグラウンドで読み込みます。私は、URLから読み込んだ画像を持っています。UITableViewは、バックグラウンドですべてのセルを一度読み込みます。

問題は私がスクロールを開始するときです。 TableViewは同期してセルの再読み込みを開始するので、異なるコンテンツで「点滅」します。

ゆっくりとスクロールすると、点滅し、最終的には正しい内容でセルを埋めますが、速くすると内容がシャッフルされます。面白いですが、それでも問題です。

私は一番良い解決策は、セルを一度ロードして静的テーブルをスクロールすることだと思います。出来ますか??

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if self.dialogs[indexPath.item].fromID == profileID { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "dialogMeCell", for: indexPath) as! CellForDialogMe 
     DispatchQueue.global().async { 
      let photoURL = self.partners[indexPath.item].userPhoto as! String 
      let imageData = try? Data(contentsOf: URL(string: photoURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)!) 
      let partnerPhoto = UIImage(data: imageData!) 
      DispatchQueue.main.async { 
       let partnerName = "\(self.partners[indexPath.item].userName!) " + "\(self.partners[indexPath.item].userSurname!)" 
       var messageText = "" 
       if self.dialogs[indexPath.item].hasAttachments! == true { 
        messageText = "Attachment" 
       } 
       else { 
        messageText = self.dialogs[indexPath.item].text! 
       } 
       if self.dialogs[indexPath.item].readState == false { 
        cell.message.textColor = UIColor.white 
        cell.message.backgroundColor = UIColor(red: 0.561, green: 0.651, blue: 0.757, alpha: 1.00) 
       } 
       cell.fillWithContent(partnerPhoto: partnerPhoto!, partnerName: partnerName, message: messageText, selfPhoto: self.profilePhoto!) 
      } 
     } 
     return cell 
    } 
else { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "dialogHimCell", for: indexPath) as! CellForDialogHim 
     DispatchQueue.global().async { 
      let photoURL = self.partners[indexPath.item].userPhoto as! String 
      let imageData = try? Data(contentsOf: URL(string: photoURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)!) 
      let partnerPhoto = UIImage(data: imageData!) 
      DispatchQueue.main.async { 
       let partnerName = "\(self.partners[indexPath.item].userName!) " + "\(self.partners[indexPath.item].userSurname!)" 
       var messageText = "" 
       if self.dialogs[indexPath.item].hasAttachments! == true { 
        messageText = "Attachment" 
       } 
       else { 
        messageText = self.dialogs[indexPath.item].text! 
       } 
       if self.dialogs[indexPath.item].readState == false { 
        cell.partnerName.textColor = UIColor.white 
        cell.message.textColor = UIColor.white 
        cell.backgroundColor = UIColor(red: 0.561, green: 0.651, blue: 0.757, alpha: 1.00) 
       } 
       cell.fillWithContent(partnerPhoto: partnerPhoto!, partnerName: partnerName, message: messageText) 
      } 
     } 
     return cell 
    } 
} 

ありがとう!

答えて

0

最高の解決策は、画像をキャッシュすることです。画像がキャッシュにない場合にのみ、非同期要求を行います。キャッシュにイメージがある場合は、キャッシュされたイメージを表示するだけです。あなたは[String:UIImage]の辞書を保持し、そのURLをキーとして使うことができますが、これはあまり記憶には向いていません。はるかに洗練されたキャッシュを書くことができますが、すでに他の人が行っているので、私はちょうどそのうちの1つを使うことをお勧めします:SDwebImageAlamofireImage

関連する問題