【问题标题】:Wrong Images Loaded to TableView错误的图像加载到 TableView
【发布时间】:2019-11-06 23:24:04
【问题描述】:

这是我第一次将 NSCache 用于表格视图。对于cellForRow,我调用 NSCache 加载图像。图像有时是错误的图像。我能做些什么来解决这个问题?如果缓存不包含它,我将照片替换为“randomguy”。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyMessagesTableViewCell", for: indexPath) as! MyMessagesTableViewCell
    if let cachedImage = cache.object(forKey: urlArray[indexPath.row] as NSString) as? UIImage {
        cell.proPicImageView.image = cachedImage
        cell.proPicImageView.layer.cornerRadius =
        cell.proPicImageView.frame.size.height / 2
        cell.proPicImageView.layer.masksToBounds = true
        cell.proPicImageView.layer.borderWidth = 0
        cell.usernameLabel.text = usernameArray[indexPath.row]
        cell.messageLabel.text = messageArray[indexPath.row]
        cell.messageLabel.textColor = colorArray[indexPath.row]
        cell.messageLabel.font = fontArray[indexPath.row]
        cell.timeLabel.text = timeArray[indexPath.row]
    } else {
        cell.proPicImageView.image = UIImage(named: "randomguy")
        cell.proPicImageView.layer.cornerRadius =
        cell.proPicImageView.frame.size.height / 2
        cell.proPicImageView.layer.masksToBounds = true
        cell.proPicImageView.layer.borderWidth = 0
        cell.usernameLabel.text = usernameArray[indexPath.row]
        cell.messageLabel.text = messageArray[indexPath.row]
        cell.messageLabel.textColor = colorArray[indexPath.row]
        cell.messageLabel.font = fontArray[indexPath.row]
        cell.timeLabel.text = timeArray[indexPath.row]
    }

    return cell
}

在视图中加载: 让缓存 = NSCache()

    func photoQuery () {
    for username in self.usernameArray {
        let photoQuery = PFQuery(className: "UserPhoto")
        photoQuery.whereKey("username", equalTo: username)
        photoQuery.findObjectsInBackground(block: { (objects: 
        [PFObject]?,error: Error?) in
        if let objects = objects {
            for object in objects {
                if error == nil {
                let userImageFile = object["photo"] as? PFFileObject
                let urlString = userImageFile?.url as! String

                    if let url = URL(string: urlString) {
                        let data = try? Data(contentsOf: url)
                        if let imageData = data {
            self.messageImageArray.append(UIImage(data:imageData)!)
            self.cache.setObject(UIImage(data:imageData)!, forKey: urlString as 
            NSString)
            self.urlArray.append(urlString as NSString)
            print(self.messageImageArray)
                        }
                    }
            }
        }

            }
        })
    }
}

【问题讨论】:

  • 为什么有这么多数组?您只有一个数组,其中每个元素都是一个结构,其中包含用户名、消息等字段。
  • 您需要提供有关如何创建和填充缓存的更多详细信息。
  • 使用数组的模型,在if else 外做同样的代码
  • 用 cache.setobject 更新了它
  • 我认为问题在于我错误地附加了 URLArray。

标签: swift uitableview nscache


【解决方案1】:

这可能是您可以创建自定义图像视图并在其中具有一个功能的一种方式,该功能将负责下载图像并将其分配给正确的单元格

let cache = NSCache<NSString, UIImage>()

class CustomImageView: UIImageView {
    var imageURLString: String?

    func startImageDownloadOperation(url: URL) {
        imageURLString = url.absoluteString

        if let cachedVersion = cache.object(forKey: url.absoluteString as NSString) {
            self.image = cachedVersion
        } else {
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                guard error == nil,
                    let response = response as? HTTPURLResponse,
                    response.statusCode == 200 else {
                        DispatchQueue.main.async {
                            self.image = UIImage(named: "default")
                        }
                        return
                }

                DispatchQueue.main.async {
                    if let data = data {
                        let imageToCache = UIImage(data: data)
                        if url.absoluteString == self.imageURLString {
                            self.image = imageToCache
                            cache.setObject(imageToCache!, forKey: url.absoluteString as NSString)
                        }
                    }
                }
            }

            task.resume()
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多