按顺序异步下载图像

时间:2015-12-10 21:26:00

标签: ios swift asynchronous grand-central-dispatch imagedownload

我正在尝试下载图片,但下载的图片按特定顺序排列至关重要。我使用以下代码下载图像:

func downloadImage(url: NSURL, completionHandler: (response: UIImage) -> ()){
    print("Started downloading \"\(url.URLByDeletingPathExtension!.lastPathComponent!)\".")
    manager.getDataFromUrl(url) { (data, response, error)  in
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            guard let data = data where error == nil else { return }
            print("Finished downloading \"\(url.URLByDeletingPathExtension!.lastPathComponent!)\".")
            completionHandler(response: UIImage(data: data)!)
        }
    }
}

我正在使用此代码来调用downloadImage

self.downloadImage(NSURL(string: self.url)!, completionHandler: { response in
                            dispatch_async(dispatch_get_main_queue()) {
                                self.images.append(response)
                            }
                        })

问题是图像以正确的顺序开始下载但是响应不是(这显然是因为图像的大小不同而且图像的速度更快)。所以正在发生的是所有图像都开始下载,并且首先附加到images : [UIImage]数组。如何才能使images数组中的图像按顺序排列?

我还试图在调用downloadImage函数

时删除主要块
self.downloadImage(NSURL(string: self.url)!, completionHandler: { response in                     
             self.images.append(response)
       })

2 个答案:

答案 0 :(得分:1)

您无法控制下载顺序,无论您创建URL对象的顺序如何,都将对同一服务器的所有请求进行流水线操作。此外,某些URL可能会被缓存,而其他URL可能需要转到远程服务器。你需要做的是维护一个包含url到实际数据映射的可变数组或字典,然后等待所有url完全下载,然后按已知顺序迭代。

答案 1 :(得分:0)

最简单的方法是,您可以在下载后使用其网址保存Dictionary中的每个图片。像var imageData = [String: NSData]()一样。稍后您可以对其进行排序或按键(url)使用它。