按顺序异步下载图片

Downloading Images Asynchronously in Sequence

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

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)
       })

您无法控制下载顺序,因为无论您在其中创建 URL 对象的顺序如何,对同一服务器的所有请求都将通过管道传输。另外,一些 URLs可能被缓存,而其他人可能需要去远程服务器。您需要做的是维护一个包含 url 到实际数据映射的可变数组或字典,然后等到所有 url 都已完全下载,然后以已知顺序迭代。

最简单的方法是下载后将Dictionary中的每张图片连同它们的url一起保存。喜欢var imageData = [String: NSData]()。稍后您可以对其进行排序或按键使用(url).