Я занимаюсь разработкой библиотеки загрузки изображений в Swift 4, например, Kingfisher с некоторыми расширениями для поддержки загрузки изображений из URL в UIImageView.
Так что тогда я могу использовать это расширение на UICollectionили ячейка UITableview с UIImageView следующим образом:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier:
"collectioncell", for: indexPath)
if let normal = cell as? CollectionViewCell {
normal.imagview.loadImage(fromURL:imageURLstrings[indexPath.row])
}
По сути, это мой код расширения, реализующий базовый URLSession dataTask и Caching
public extension UIImageView {
public func loadImage(fromURL url: String) {
guard let imageURL = URL(string: url) else {
return
}
let cache = URLCache.shared
let request = URLRequest(url: imageURL)
DispatchQueue.global(qos: .userInitiated).async {
if let data = cache.cachedResponse(for: request)?.data, let
image = UIImage(data: data) {
DispatchQueue.main.async {
self.image = image
}
} else {
URLSession.shared.dataTask(with: request,
completionHandler: { (data, response, error) in
print(response.debugDescription)
print(data?.base64EncodedData() as Any)
print(error.debugDescription)
if let data = data, let response = response, ((response as? HTTPURLResponse)?.statusCode ?? 500) < 300, let image = UIImage(data: data) {
let cachedData = CachedURLResponse(response: response, data: data)
cache.storeCachedResponse(cachedData, for: request)
DispatchQueue.main.async {
self.image = image
}
}
}).resume()
}
}
}
}
В заключение я обнаружил, что иногда, если мой URLсломан, или я получаю 404, или даже если я прокручиваю UICollectionView до того, как все изображения полностью загружены, изображения загружаются в неправильную ячейку, или я иногда нахожу дубликаты изображений в collectionView, но этого не происходит, если я использую Kingfisher.
Это мои результаты
Это зимородки
Как мне запретить моему расширению загружать неправильное изображение в ячейку или дублировать изображения?