如何异步下载图片并保持顺序?
How to download image asynchronously and keep the order?
我尝试使用异步请求从 iTunes api 下载多个图像,我已经将图像 url 存储在数组中。但是当我下载图像并将其放在新数组中时,图像顺序变得随机。
这是我的代码:
for appDict in appArray {
let songCoverUrl: String? = appDict["im:image"][0]["label"].string
let largerImageUrl = songCoverUrl!.stringByReplacingOccurrencesOfString("55x55", withString: "400x400")
if largerImageUrl.isEmpty == false {
let url : NSURL = NSURL(string: largerImageUrl)!
let request : NSURLRequest = NSURLRequest(URL: url)
NSURLSession.sharedSession().dataTaskWithRequest(request){ (imagedata:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if error == nil {
let image : UIImage = UIImage(data: imagedata!)!
self.coverArray.append(image)
}else{
let image : UIImage = UIImage(named: "noArtworkImage.png")!
self.coverArray.append(image)
}
}.resume()
}
}
如何将图像的顺序保持为 url 的数组?
您需要存储 songCoverUrl 对象的原始顺序。
我会建议两种方法之一,预先创建数组并使用 [Image?] allow nil entries that aren't downloaded yet and simply go:
myArray[indexOfImagesUrlInOriginalList] = justDownloadedImage.
或者沿着类似的路线使用带有 INDEX 预完成的字典。
[NSInteger : UIImage] 并在成功下载后再次找到 url 的索引(使用 response.request.url)
或者更巧妙地将 imageUrl 绑定到图像:
let lookup = [String : UIImage]()
look[myImageUrl] = justDownloadedImage
然后进行排序。
事实上,无论哪种方式都需要您在成功完成后检索 URL,然后搜索原始项目数组以找到索引。
您可以感染创建一个查找 [String : NSInteger] ,它是 myLookup[currentUrl] = i (其中 i 是下载前循环的索引)
var indexLookup = [String : Integer]()
for index,appDict in enumerate(appArray) {
let songCoverUrl: String? = appDict["im:image"][0]["label"].string
let largerImageUrl = songCoverUrl!.stringByReplacingOccurrencesOfString("55x55", withString: "400x400")
indexLookup[index] = largerImageUrl
//....
}
我尝试使用异步请求从 iTunes api 下载多个图像,我已经将图像 url 存储在数组中。但是当我下载图像并将其放在新数组中时,图像顺序变得随机。
这是我的代码:
for appDict in appArray {
let songCoverUrl: String? = appDict["im:image"][0]["label"].string
let largerImageUrl = songCoverUrl!.stringByReplacingOccurrencesOfString("55x55", withString: "400x400")
if largerImageUrl.isEmpty == false {
let url : NSURL = NSURL(string: largerImageUrl)!
let request : NSURLRequest = NSURLRequest(URL: url)
NSURLSession.sharedSession().dataTaskWithRequest(request){ (imagedata:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if error == nil {
let image : UIImage = UIImage(data: imagedata!)!
self.coverArray.append(image)
}else{
let image : UIImage = UIImage(named: "noArtworkImage.png")!
self.coverArray.append(image)
}
}.resume()
}
}
如何将图像的顺序保持为 url 的数组?
您需要存储 songCoverUrl 对象的原始顺序。
我会建议两种方法之一,预先创建数组并使用 [Image?] allow nil entries that aren't downloaded yet and simply go:
myArray[indexOfImagesUrlInOriginalList] = justDownloadedImage.
或者沿着类似的路线使用带有 INDEX 预完成的字典。 [NSInteger : UIImage] 并在成功下载后再次找到 url 的索引(使用 response.request.url)
或者更巧妙地将 imageUrl 绑定到图像:
let lookup = [String : UIImage]()
look[myImageUrl] = justDownloadedImage
然后进行排序。
事实上,无论哪种方式都需要您在成功完成后检索 URL,然后搜索原始项目数组以找到索引。 您可以感染创建一个查找 [String : NSInteger] ,它是 myLookup[currentUrl] = i (其中 i 是下载前循环的索引)
var indexLookup = [String : Integer]()
for index,appDict in enumerate(appArray) {
let songCoverUrl: String? = appDict["im:image"][0]["label"].string
let largerImageUrl = songCoverUrl!.stringByReplacingOccurrencesOfString("55x55", withString: "400x400")
indexLookup[index] = largerImageUrl
//....
}