Использование 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()метод в пользовательской ячейке представления коллекции.

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

Любая помощь здесь будет оценена. Спасибо

0 ответов

Другие вопросы по тегам