Я загружаю пару изображений и хочу показать пользователю какой-то прогресс, пока он не закончится. Я нашел способ отслеживать ход выполнения задач с данными из этого вопроса но он отслеживает ход загрузки только одной задачи. Я хотел бы получить ход выполнения всех задач вместе с момента запуска первой до завершения загрузки последней.
Отслеживание загрузки с этим наблюдением я нашел по предоставленной ссылке.
private var observation: NSKeyValueObservation?
deinit {
observation?.invalidate()
}
загрузить все изображения из массива ссылок
for Url in URLArray{
dispatchImages.enter()
getImage(withURL: URL(string: Url)!){ image in
dispatchImages.leave(
}
}
проверьте, было ли изображение уже кэшировано ранее
// MARK: getImage
func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?)->()) {
if let cachedVersion = cache.object(forKey: url.absoluteString as NSString) {
print("image was cached before")
completion(cachedVersion.image)
} else {
downloadImage(withURL: url, completion: completion)
}
}
скачать образ с заданием данных
// MARK: downloadImage
func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?)->()) {
let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
var downloadedImage:UIImage?
if let error = error{
print(error)
}
if let data = data {
downloadedImage = UIImage(data: data)
}
// when url contains an image
if downloadedImage != nil {
print("image was downloaded")
// cache the image
let cacheImage = ImageCache()
cacheImage.image = downloadedImage
self.cache.setObject(cacheImage, forKey: url.absoluteString as NSString)
}
DispatchQueue.main.async {
completion(downloadedImage)
}
}
observation = dataTask.progress.observe(\.fractionCompleted) { progress, _ in
print("progress: ", progress.fractionCompleted)
}
dataTask.resume()
}