将图像数组下载为字节数组并转换为图像

时间:2018-06-13 11:45:37

标签: ios arrays swift image asynchronous

 for i in 0..<array.count
    {
        let escapedString = array[i].addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
        var c = ""
        DispatchQueue.main.async {
            Alamofire.request("url&mfileName=\(escapedString!)").responseJSON { response in
                switch response.result{
                case .success(let data) :
                    let json = JSON(data)
                    c = json["imageBase64"].stringValue
                    if let decodedData = Data(base64Encoded: c , options: .ignoreUnknownCharacters) {
                        let image = UIImage(data: decodedData)!
                        //self.docimages.append(image!)
                        self.docimages.append(image)
                    }
                    break

                case .failure(let error) :
                    print(error)
                    break
                }
            }
        }
    }

我有一系列图像路径。我必须进行API调用以获取每个图像的字节数组。获得数组后,我必须将它添加到图像数组。

问题是图像的下载顺序与初始阵列的顺序不同。有没有什么办法可以按照与初始数组相同的顺序下载图像。

3 个答案:

答案 0 :(得分:0)

是的,你可以。有多种方法可以做到这一点。但在这里,我将以最简单的方式向您解释。

在这里,你犯了一个错误。您需要创建一个staging,如下所示。

STEP:1

live

STEP:2 现在,使用for循环,您将拥有类对象索引&amp; ImagePath 驻留在其中。

STEP:3 最后一步,您只需要分配刚刚下载到此类对象的UIImage。

答案 1 :(得分:0)

是您可以使用以下方法以相同的顺序下载图像

//Declare the Variables Globally
var imageDownloadArrayString = [String]() 
var imageDownloadArray = [UIImage]()
var imageUrl : [URL] = []

// Put the your image path
for imageUrls in imagePathArray {  // put your image path array
  //self.imageDownloadArrayString.append(imageUrls)  // imagePathArray in String
  self.imageUrl.append((URL(string:imageUrls)! as NSURL) as URL)
}

//Download the images

DispatchQueue.main.async(execute: {
 for url in self.imageUrl {
    let image = try! UIImage(data: Data(contentsOf: url))
    self.imageDownloadArray.append(image!) 
  }
}

此imageDownloadArray包含图像的顺序。有疑问请问我?这段代码对我有用!

答案 2 :(得分:0)

您可以将AsyncBlockOperation与OperationQueue一起使用 在其他图像开始下载之前强制每个图像竞争请检查图像

enter image description here

实施例

     let queue = OperationQueue()

        queue.maxConcurrentOperationCount = 1
        downloadImage(path: "path1")
        downloadImage(path: "path2")
        downloadImage(path: "path3")
        downloadImage(path: "path4")
        downloadImage(path: "path5")

func downloadImage(path:String){

    queue.addOperationWithAsyncBlock { op in

        Alamofire.request(path).responseJSON { response in
            switch response.result{
            case .success(let data) :
                let json = JSON(data)
                c = json["imageBase64"].stringValue
                if let decodedData = Data(base64Encoded: c , options: .ignoreUnknownCharacters) {
                    let image = UIImage(data: decodedData)!
                    //self.docimages.append(image!)
                    self.docimages.append(image)
                    op.complete()

                }
                break

            case .failure(let error) :
                print(error)
                break
            }
        }

    }
}