要在 Swift 中循环等待(无论如何都是背景)?

To wait in a loop (that backgrounds anyway) in Swift?

在Swift(即Swift)中有多种处理异步的方法,

假设您有一个这样的循环 - 它正在调用解析云代码调用 无论如何都会进入后台

public func runImages()
   {
   print("test begins...")
   for i in 1...3
      {
      print("Tick tock tick tock ..\(i)")
      PFCloud.callFunctionInBackground("blah", withParameters:["bla":i,"bla":"bla] )
         {
         (response: AnyObject?, error: NSError?) -> Void in
          print(".. done! Now go again...")
          if let rr = response as? String { print(rr) }
          if let err = error { print(err.domain) }
         }
      }
   }

如何让它等待每个 PFCloud 调用结束?

真的只是一面普通的旗帜最好,还是? (请注意(a)我无法在 Swift 中使用标志,并且(b)正如保罗指出的那样,您正在阻止 UI!!)

您在此处看到的"Swift way"上下文是什么?例如,我觉得在这里使用递归模式会很不优雅。

如果您希望这三个调用串行执行,那么您可以使用一个串行调度队列和一个 dispatch_barrier_async 在所有三个调用都完成后执行某些操作 -

let dispatchQueue=dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL)

for i in 1...3 {
    dispatch_async(dispatchQueue, { () -> Void in
        print("i=\(i)")
        let result = PFCloud.callFunction("blah", withParameters:["bla":i,"bla":"bla] )
    })
}

dispatch_barrier_async(dispatchQueue, { () -> Void in
    print("really done")
})

print(" done")

为了使其与您的 Parse 函数一起使用,您需要使用同步云代码调用,而不是异步调用。如果您在 dispatch_barrier_async 闭包中更新 UI,则需要将其分派到主队列中。