Использование DispatchWorkItem для получения данных изображения из URL, как отменить задачу при прокрутке (или при вызове метода prepareToReuse())
Я получаю URL-адреса изображений, а затем получаю данные изображения с этих URL-адресов. я решил использоватьDispatchWorkItem
отправитьData(contentsOf: URL)
метод в фоновую очередь. Как только задача завершена, рабочий элемент уведомляет основной поток, и я вызываю завершение закрытия:
Вот код для этогоImageDownloader
сорт:
class ImageDownloader {
let queue = DispatchQueue.global(qos: .utility)
var task: URLSessionTask?
var workItem: DispatchWorkItem?
func imageDownloader(url: String, completion: @escaping (UIImage?, URL) -> ()) {
guard let imageURL = URL(string: url) else { return }
var imageData: Data?
workItem = DispatchWorkItem {
do {
imageData = try Data(contentsOf: imageURL)
}
catch {
print("Error: URL cannot be converted to data")
}
}
queue.async(execute: workItem!)
workItem!.notify(queue: .main) {
guard let photoData = imageData else { return }
let image = UIImage(data: photoData)
completion(image, imageURL)
}
}
}
Я хотел бы отменить рабочий элемент, поэтому я создал метод в том же классеCancelImageRequest
:
func cancelImageRequest() {
workItem?.cancel()
}
я звонюcancelImageRequest()
вprepareToReuse()
метод в пользовательской ячейке представления коллекции.
Однако при загрузке фотографий высокого качества я все еще получаю ту же проблему, когда при прокрутке отображается содержимое предыдущего изображения. Как выполнить отмену задачи, если ячейка повторно используется/прокручивается с экрана.
Любая помощь здесь будет оценена. Спасибо