我有一个函数让我们称之为“a”运行一些代码然后返回一个字符串“x”在异步代码块中更新然后返回。
在异步代码运行之后,如何让程序等待返回x?
func a() -> String {
//code
//code
var x: String
async block {
x = "test"
}
return x
}
答案 0 :(得分:6)
像所有人都指出的那样,您可以使用完成处理程序(closure
)来执行操作。但您也可以使用DispatchSemaphore
等待异步调用完成。信号量在进行wait
调用时获得锁定,并在从异步数据块发出信号时被释放。
func a()->String{
var x = ""
let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.main.async {
x = "test"
semaphore.signal()
}
semaphore.wait()
return x
}
答案 1 :(得分:1)
您可以使用完成闭包
func a(completion: @escaping (_ value:String)->()) {
var x: String = ""
async block {
x = "test"
completion(x) //when x has new value
}
}
//像这样调用(返回完成块时将执行值
a { (value) in
print(value)
}