【问题标题】:completion handler with for loop and asynchronous image upload带有 for 循环和异步图像上传的完成处理程序
【发布时间】:2018-09-01 08:48:46
【问题描述】:

我需要一个完成处理程序或类似的东西,以确保每张图片都已上传,并且下载网址存储在字典中。

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() 调用,但我认为需要它。

【问题讨论】:

    标签: swift firebase for-loop asynchronous completionhandler


    【解决方案1】:

    完成在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 才处理下一个

    【讨论】:

    • 干杯,我之前尝试过这个,但当时我还没有实现异步处理程序,这导致在第一个 for 循环之后完成。但现在,它工作得很好!
    • 快乐编码 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2019-01-13
    相关资源
    最近更新 更多