, мы заверяем, что представление изображения, изображение которого мы меняем, является той же строкой, для которой предназначено изображение. Надеюсь, поможет!
чание: пожалуйста, нет библиотек. Это важно для меня, чтобы учиться. Кроме того, есть множество ответов на этот вопрос, но ни один, который я нашел, не решает проблему хорошо. Пожалуйста, не отмечайте как дубликат. Заранее спасибо!
У меня проблема в том, что если вы прокрутите таблицу очень быстро, вы увидите старые изображения и мерцание.
Решение из вопросов, которые я прочитал, состоит в том, чтобы отменитьURLSession
запрос данных. Но я не знаю, как это сделать в нужном месте и в нужное время. Могут быть и другие решения, но не уверен.Это то, что я до сих пор:
Класс кеша изображений
class Cache {
static let shared = Cache()
private let cache = NSCache<NSString, UIImage>()
var task = URLSessionDataTask()
var session = URLSession.shared
func imageFor(url: URL, completionHandler: @escaping (image: Image? error: Error?) -> Void) {
if let imageInCache = self.cache.object(forKey: url.absoluteString as NSString) {
completionHandler(image: imageInCache, error: nil)
return
}
self.task = self.session.dataTask(with: url) { data, response, error in
if let error = error {
completionHandler(image: nil, error: Error)
return
}
let image = UIImage(data: data!)
self.cache.setObject(image, forKey: url.absoluteString as NSString)
completionHandler(image: image, error: nil)
}
self.task.resume()
}
}
использование
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let myImage = images[indexPath.row]
if let imageURL = URL(string: myImage.urlString) {
photoImageView.setImage(from: imageURL)
}
return cell
}
Какие-нибудь мысли?