【问题标题】:completionhandler in for in loopfor in 循环中的完成处理程序
【发布时间】:2018-05-07 07:53:14
【问题描述】:

我在 for in 循环中运行完成处理程序,所以是的,循环中的异步操作...

这就是我加入DispatchGroups()的原因:

for fileName in fileNames {
    group.enter()
    let url = URL(fileURLWithPath: "\(self.documentsUrl.path)/\(fileName)")
    let ref = storage.reference().child("pathTo/\(fileName)")
    let _ = ref.putFile(from: url, metadata: nil) { metadata, error in
         print("completed")
         if let error = error {
             print("error")
         } else {
             print("success")
         }
         self.removeFile()
         group.leave()
     }
  }
  group.notify(queue: .main, execute: {
      print("finished")
  })

好吧,文件路径存在,但我在控制台中没有得到任何打印,但我需要在每个异步操作完成后得到通知。有人可以帮我吗?

【问题讨论】:

  • 如果将所有 for 代码放入 DispatchQueue.main.async{} 方法而不是 group.enter 会发生什么?
  • 设置断点,看看打印的内容。顺便说一句,“完成”是否正在打印?
  • 嘿,我包含了 DispatchQueue.main.async{} 并且控制台中仍然没有打印..有人可以指导我如何让回调工作,这样我就可以对成功/错误事件做出反应?
  • 控制台中没有打印什么?你能解释一下,你在哪里调用你的完成处理程序?
  • 您想在所有操作完成后通知?然后在您打印完成的语句之后调用您的闭包

标签: ios swift loops asynchronous completionhandler


【解决方案1】:

假设您正在上传到 Firebase。

要尝试的几件事: 将 let _ = ref.putFile(from: url... 更改为 let uploadObj = ref.putFile(from: url...
然后,在 for 循环的最后一行执行以下操作:uploadObj.resume()

如果这不起作用,那么我最好的猜测是 Firebase 的框架无法处理多个同时上传。解决方法是等待每个文件完成上传,然后再上传下一个。

您也可以尝试您的代码,但只能上传 1 个文件。如果可行,那么问题很可能是并发上传问题。用 2 试试,如果没有失败就继续。如果它最终失败了,那么同时性肯定是问题所在。

如果您坚持尝试同时上传,请转到Google's documentation on this,并实施他们的示例来监控上传。然后,您将能够准确地看到每次上传的内容。

这里有一个更新:
This post 的回答还建议一次上传一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2018-09-01
    相关资源
    最近更新 更多