带有 for 循环和异步图像上传的完成处理程序

completion handler with for loop and asynchronous image upload

我需要一个完成处理程序或类似的东西来确保每个图像都被上传并且下载 url 存储在字典中。

func saveImages(images: [UIImage], completion: @escaping ([String : Any], String) -> Void) {

    let ref = FirDatabaseReference.courts.reference()
    let upload = ref.childByAutoId()
    let uploadID = upload.key

    // save images
    var urlDict = [String : Any]()
    DispatchQueue.main.async {
        for i in 0..<images.count {
            let saveID = "\(uploadID)_\(i)"
            let firImage = FIRImage(image: images[i])
            firImage.save(uploadID, imageUid: saveID, completion: { (url, error) in
                if error == nil {
                    urlDict["\(i)"] = url
                }
            })
        }
        completion(urlDict, uploadID)
    }
}

然而,完成是用一个空的 urlDict 或更好的说法立即调用的,没有添加任何东西。 我尝试了很多东西,但没有真正解决。我不确定在哪里放置 Dispatch.main.asynch() 调用,但我认为有必要。

完成是 out-side 的 firImage.save 调用,因此它将在您得到响应之前执行

  // save images
var urlDict = [String : Any]()
DispatchQueue.main.async {
    for i in 0..<images.count {
        let saveID = "\(uploadID)_\(i)"
        let firImage = FIRImage(image: images[i])
        firImage.save(uploadID, imageUid: saveID, completion: { (url, error) in
            if error == nil {
                urlDict["\(i)"] = url
                completion(urlDict, uploadID)

            }
        })
    }

}

此完成将被多次调用在完成数组计数等于您在 for 循环中设置的 images.count 之前不要处理下一个