這聽起來像你需要等待兩個或多個遠程調用的結果然後才能發出最終的遠程呼叫。比方說,你有這些參數,這將通過遠程調用來填充兩個屬性:
var a:String? = nil // populated asynchronously
var b:String? = nil // populated asynchronously
然後,假設你的遠程調用是這樣的:
func getParameterA(completionHandler:(String) -> Void) {
print("Getting parameter A")
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
NSThread.sleepForTimeInterval(0.2)
completionHandler("A")
print("Got parameter A")
}
}
func getParameterB(completionHandler:(String) -> Void) {
print("Getting parameter B")
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
NSThread.sleepForTimeInterval(0.1)
completionHandler("B")
print("Got parameter B")
}
}
func getResult(a:String, b:String, completionHandler:(String) -> Void) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
NSThread.sleepForTimeInterval(0.05)
completionHandler("This is the result of \(a) and \(b)")
}
}
在現實中,他們將遠程調用而不是睡在後臺線程上。
然後,你的代碼來填充a
和b
看起來就像這樣:
// the blocks in the parameter group are responsible for setting a and b
let parameterGroup = dispatch_group_create()
dispatch_group_enter(parameterGroup)
getParameterA() { parameter in
// set the value of a asynchronously
self.a = parameter
dispatch_group_leave(parameterGroup)
}
dispatch_group_enter(parameterGroup)
getParameterB() { parameter in
// set the value of b asynchronously
self.b = parameter
dispatch_group_leave(parameterGroup)
}
最後,你可以用dispatch_group_notify
定義最終完成處理程序只執行一次,有沒有更多的任務parameterGroup
:
let finalGroup = dispatch_group_create()
dispatch_group_enter(finalGroup)
dispatch_group_notify(parameterGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
self.getResult(self.a!, b:self.b!) { result in
print("-- \(result)")
dispatch_group_leave(finalGroup)
}
}
dispatch_group_wait(finalGroup, DISPATCH_TIME_FOREVER)
finalGroup
不是嚴格必要的,但我需要它來得到範例在XCTest
內工作。
輸出將是這樣的:
Getting parameter A
Getting parameter B
Got parameter B
Got parameter A
-- This is the result of A and B
,你做'dispatch_group_enter(groupTwo)塊,如果'groupTwo'爲空,並在第一時間之後執行的第一個'dispatch_group_notify'檢查'版畫「第三「一旦發現它是。 – dan
我沒有想到'dispatch_group_notify'甚至會在dispatch_group_leave之前被調用。有沒有更好的方法來完成我想要做的事情? – chicobermuda
這是不是很清楚你想做什麼。我假設你爲了這個問題抽象了所有的細節,但是很難說出你應該做什麼。 – dan