Неправильные изображения загружены в TableView - PullRequest
0 голосов
/ 07 ноября 2019

Я впервые использую 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
}

В связи с этим сделал загрузку: let cache = 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)
                        }
                    }
            }
        }

            }
        })
    }
}

1 Ответ

0 голосов
/ 08 ноября 2019

Это может быть один из способов, где вы можете создать свой собственный вид изображения и иметь внутри него функцию, которая позаботится о загрузке и назначении изображения для соответствующей ячейки

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()
        }
    }
}
...