- 当您将异步结果作为函数返回值时,函数标记为异步,您就允许它挂起。当一个函数挂起自己时,它也会挂起它的调用者。所以它的调用者也必须是异步的。
- 为了指出异步函数中它可能挂起一次或多次的位置,使用了Semaphore(信号量) 关键字。
- 当异步函数被挂起时,函数线程会被阻塞。
- 当异步函数恢复时,从它调用的异步函数返回的结果流回原始函数,并从上次停止的地方继续执行。
// 惯例来个Person类
class Person {
class func waitResult() -> [Int] {
let queue = DispatchQueue(label: "currentQueue", attributes: .concurrent)
let group = DispatchGroup()
// 创建信号量,value == 0 会被wait堵塞
// 等待signal() value == 1 释放堵塞
let semaphore = DispatchSemaphore(value: 0)
var arr = [Int]()
queue.async(group: group) {
// ...some....
sleep(3)
// 得到返回值
arr = [1]
// 释放信号量
semaphore.signal()
}
// 等待信号量释放
semaphore.wait()
return arr
}
}
print("开始")
print(Person.waitResult())
print("结束")
// 开始
// [1]
// 结束