异步按顺序下载图像

3

我想下载图片,但是下载的图片必须按照特定的顺序排列。以下是我用来下载图片的代码:

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个回答

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

是的,我也想到了。感谢提供信息。我也打算采用数据映射路线,但在这样做之前,我想尽可能地尝试所有可能性。谢谢@MoDJ。 - Bhavik P.

0

最简单的方法是在下载后将每个图像与其URL保存在Dictionary中。例如:var imageData = [String: NSData]()。稍后您可以按键(URL)对其进行排序或使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接