要在 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,则需要将其分派到主队列中。
在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,则需要将其分派到主队列中。