Swift - 为什么 DispatchGroup 在这个函数中不起作用?
Swift - Why is DispatchGroup not working in this function?
我正在等待 idToken
返回变量之前的响应。
请不要告诉我只使用完成处理程序并在没有 DispatchGroup
的情况下调用它。我知道我可以做到,但我试图理解为什么这个逻辑不起作用。
func createToken() -> String {
var token = "empty"
var group = DispatchGroup()
group.enter()
let currentUser = Auth.auth().currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
token = idToken ?? "error"
print("Token Set")
group.leave()
}
group.wait(timeout: DispatchTime.now() + 10)
return token
}
运行:
print("create ")
print(createToken())
print("done")
输出:
create
empty
done
Token Set
如果 getIDTokenForcingRefresh
将其完成处理程序闭包分派回主队列,您会准确地看到您所描述的行为。当执行命中 wait
调用时,它将阻塞主线程。但是如果完成处理程序闭包被分派到主队列,那么在 wait
调用超时并且主线程再次被释放之前将无法 运行。
你可以证实这个论点,即 getIDTokenForcingRefresh
正在主线程上以多种方式调用它的完成处理程序:
尝试删除 timeout
,在这种情况下,如果使用主 queue/thread.
,此代码将完全死锁
打印Thread.isMainThread
.
添加前置条件语句:
dispatchPrecondition(condition: .onQueue(.main))
在此闭包中设置断点,让调试器告诉您使用了哪个线程。
但你说得很对:一般情况下应该避免使用 wait
模式。
我正在等待 idToken
返回变量之前的响应。
请不要告诉我只使用完成处理程序并在没有 DispatchGroup
的情况下调用它。我知道我可以做到,但我试图理解为什么这个逻辑不起作用。
func createToken() -> String {
var token = "empty"
var group = DispatchGroup()
group.enter()
let currentUser = Auth.auth().currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
token = idToken ?? "error"
print("Token Set")
group.leave()
}
group.wait(timeout: DispatchTime.now() + 10)
return token
}
运行:
print("create ")
print(createToken())
print("done")
输出:
create
empty
done
Token Set
如果 getIDTokenForcingRefresh
将其完成处理程序闭包分派回主队列,您会准确地看到您所描述的行为。当执行命中 wait
调用时,它将阻塞主线程。但是如果完成处理程序闭包被分派到主队列,那么在 wait
调用超时并且主线程再次被释放之前将无法 运行。
你可以证实这个论点,即 getIDTokenForcingRefresh
正在主线程上以多种方式调用它的完成处理程序:
尝试删除
,此代码将完全死锁timeout
,在这种情况下,如果使用主 queue/thread.打印
Thread.isMainThread
.添加前置条件语句:
dispatchPrecondition(condition: .onQueue(.main))
在此闭包中设置断点,让调试器告诉您使用了哪个线程。
但你说得很对:一般情况下应该避免使用 wait
模式。