UITableView加载一次背景中的所有单元格

UITableView加载一次背景中的所有单元格,uitableview,swift3,Uitableview,Swift3,你好!非常简单的问题。 我在后台用dequeueReusableCell加载自定义单元格,因为我有从url加载的图像 问题是当我开始滚动时。TableView同步开始重新加载单元格,因此它们会“闪烁”不同的内容 如果我慢慢滚动,它会闪烁,最后用正确的内容填充单元格,但如果我滚动得更快,它会洗牌内容。很有趣,但这仍然是个问题 我认为最好的解决方案是加载传感器一次,然后滚动静态表。有可能吗 override func tableView(_ tableView: UITableView, cellF

你好!非常简单的问题。 我在后台用dequeueReusableCell加载自定义单元格,因为我有从url加载的图像

问题是当我开始滚动时。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
    }
}

谢谢

最好的解决方案是缓存图像。仅当映像不在缓存中时才发出异步请求。如果缓存中有图像,则只显示缓存的图像。虽然您可以只持有一个[String:UIImage]字典并将URL用作键,但这并不是非常内存友好或带宽友好的,因为它不会持久化。您可以编写更复杂的缓存,但其他人已经这样做了,因此我建议只使用他们的一个:

最好的解决方案是缓存您的图像。仅当映像不在缓存中时才发出异步请求。如果缓存中有图像,则只显示缓存的图像。虽然您可以只持有一个[String:UIImage]字典并将URL用作键,但这并不是非常内存友好或带宽友好的,因为它不会持久化。您可以编写更复杂的缓存,但其他人已经这样做了,因此我建议只使用他们的缓存之一: