gpt4 book ai didi

swift - 如何知道两个异步函数何时完成?

转载 作者:行者123 更新时间:2023-11-28 11:11:56 24 4
gpt4 key购买 nike

 func load(completionHandler:(someVar1 : SomeType, someVar2 : SomeType)-> Void){ 
asyncFunc1() {
(someVar1) -> Void in
}
asyncFunc2() {
(someVar2) -> Void in
}
}

当两个功能都完成后,人们将如何进行交流?我希望能够编写加载函数的 completionHandler 代码,使其在 asyncFunc1 和 asyncFunc2 都完成时执行,然后返回 someVar1 和 someVar2。

最佳答案

您可以使用计数器来了解两种方法何时完成执行。拥有一个计数器更具可扩展性,因为它允许几乎任何数量的异步方法:

func load(completionHandler:(someVar1 : SomeType, someVar2 : SomeType) -> Void){ 
var callbacksLeft = 2
let completionCallback = {
print("All calls completed, let's do some work")
}
func checkCompleted() {
callbacksLeft -= 1
if callbacksLeft == 0 {
completionCallback()
}
}

asyncFunc1() { someVar1 in
checkCompleted()
}
asyncFunc2() { someVar2 in
checkCompleted()
}
}

或者,如果可以以相同的方式调用函数,例如两者都没有参数,或者具有相同的参数列表,您可以使用数组来缩短代码(这也更不容易出错,因为在第一个实现中,如果添加新函数,您必须在两个地方更新代码- 更新 callbacksLeft 值,并添加实际的函数调用):

func load(completionHandler:(someVar1 : SomeType, someVar2 : SomeType) -> Void){ 
let funcsToCall = [asyncFunc1, asyncFunc2]
var callbacksLeft = funcsToCall.count
let completionCallback = {
print("All calls completed, let's do some work")
}

for funcToCall in funcsToCall {
funcToCall {
callbacksLeft -= 1
if callbacksLeft == 0 {
completionCallback()
}
}
}
}

即使函数的调用方式不同,您也可以将它们包装在闭包中:

let funcWrapper1 = { (callback: () -> Void)
return asyncFunc1(argumentsForFuc1, callback)
}
let funcWrapper2 = { (callback: () -> Void)
return asyncFunc2(argumentsForFunc2, callback)
}
let funcsToCall = [funcWrapper1, funcWrapper2]

关于swift - 如何知道两个异步函数何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com