Как загрузить изображения для списка URL-адресов и получать уведомления в конце такой операции с помощью Alamofire? - PullRequest
0 голосов
/ 15 марта 2019

Просто у меня есть массив строк с URL, как:

let images = ["http://www.a.pl/1.jpg", "http://www.a.pl/2.jpg", "http://www.a.pl/3.jpg"]

Как я могу создать задачи для каждого из них и получать уведомления, когда все они будут выполнены?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Это довольно упрощенный способ сделать это, но:

func didFinishLoadingImages(_ images: [String: UIImage]) {
    print(images)
    PlaygroundPage.current.needsIndefiniteExecution = false
}

let images = ["http://www.a.pl/1.jpg", "http://www.a.pl/2.jpg", "http://www.a.pl/3.jpg"]
var downloadedImages = [String: UIImage]()

let session = URLSession.shared
var downloadsRemaining = images.count
for imagePath in images {
    guard let url = URL(string: imagePath) else {
        downloadsRemaining -= 1
        continue
    }

    session.dataTask(with: url) { (data, _, _) in
        var image: UIImage?
        if let imageData = data {
            // Create the image in the background thread to avoid UI performance issues
            image = UIImage(data: imageData)
        }

        DispatchQueue.main.async {
            downloadedImages[imagePath] = image
            downloadsRemaining -= 1
            if downloadsRemaining == 0 {
                didFinishLoadingImages(downloadedImages)
            }
        }
    }
        .resume()
}
0 голосов
/ 15 марта 2019

Вот простое решение:

  1. Создание ImageAsset модели и двух псевдонимов:

    class ImageAsset {
        var url: String
        var key: String
        var image: UIImage?
        // MARK: - Initialization
        init(url: String, key: String) {
            self.url = url
            self.key = key
        }
    }
    
    typealias ImageAssetHandler = ([ImageAsset]) -> Void
    typealias ImageHandler = (UIImage?) -> Void
    
  2. Создайте функцию, которая будет принимать массив ваших изображений:

    func downloadImages(assets: [ImageAsset], completion: @escaping ImageAssetHandler) {
        let group = DispatchGroup()
        var newAssets = [ImageAsset]()
        for asset in assets {
            group.enter()
            executor.downloadImage(with: asset) { image in
                asset.image = image
                newAssets.append(asset)
                group.leave()
            }
        }
        group.notify(queue: .main) {
        completion(newAssets)
        }
     }
    
  3. Метод от какого-то исполнителя должен выглядеть так:

    func downloadImage(with asset: ImageAsset, completion: @escaping ImageHandler) {
         Alamofire.request(asset.url).responseImage { response in
             completion(response.result.value)
         }
    }
    
  4. Вот и все;)

Пример использования:

    let images = [
        "https://i.pinimg.com/originals/d9/07/ec/d907ec461fbfa0f172a1098a0d9e9324.jpg",
        "https://c402277.ssl.cf1.rackcdn.com/photos/906/images/story_full_width/sumatran-tiger-circle_44312149.jpg?1345533208",
        "https://upload.wikimedia.org/wikipedia/commons/4/41/Siberischer_tiger_de_edit02.jpg"]
    network.downloadImages(assets: images.map { ImageAsset(url: $0, key: "hejkey") }) { imageAssets in
        print("completed")
        for a in imageAssets {
            print(a.url)
            print(a.key)
            print(a.image)
            print(a.image?.size)
        }
    }

и результат в консоли:

completed
https://c402277.ssl.cf1.rackcdn.com/photos/906/images/story_full_width/sumatran-tiger-circle_44312149.jpg?1345533208
hejkey
Optional( size {333.33333333333331, 200} orientation 0 scale 3.000000)
Optional((333.3333333333333, 200.0))
https://upload.wikimedia.org/wikipedia/commons/4/41/Siberischer_tiger_de_edit02.jpg
hejkey
Optional( size {533.33333333333337, 400} orientation 0 scale 3.000000)
Optional((533.3333333333334, 400.0))
https://i.pinimg.com/originals/d9/07/ec/d907ec461fbfa0f172a1098a0d9e9324.jpg
hejkey
Optional( size {853.33333333333337, 640} orientation 0 scale 3.000000)
Optional((853.3333333333334, 640.0))
...