如何异步下载图像并保持顺序?

时间:2015-10-27 03:34:04

标签: ios arrays swift asynchronous imagedownload

我尝试使用异步请求从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()

                }
        }

如何将图像的顺序保持为网址数组?

1 个答案:

答案 0 :(得分:3)

您需要存储songCoverUrl对象的原始顺序。

我建议使用以下两种方法之一:预创建阵列并使用[Image?]允许未下载的nil条目,只需执行:

myArray[indexOfImagesUrlInOriginalList] = justDownloadedImage.

使用INDEX预先完成的字典沿类似的行。 [NSInteger:UIImage]并在成功下载后再次找到url的索引(使用response.request.url)

或者可能通过以下方式将imageUrl整齐地绑定到图像:

let lookup = [String : UIImage]()
look[myImageUrl] = justDownloadedImage

然后进行排序。

事实上,无论哪种方式都要求您在成功完成后检索URL,然后搜索原始项目数组以查找索引。 你可以感染创建一个查找[String:NSInteger],它是myLookup [currentUrl] = 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
        //....
    }