我的要求是从关闭返回值,所以我尝试了Dispatch group。
func retrieveAccessToken()->String {
var accessToken: String?
let group = DispatchGroup()
if !accessTokenExpired(){
Network.instance.networkRequest() { value in
accessToken = value
group.leave()
}
} else {
accessToken = KeychainHandler.shared[ACCESS_TOKEN]!
}
group.wait()
return accessToken!
}
如果我不使用调度组,函数返回nil, 如果我使用它我的UI被冻结。 我搜索了很多问题,但我没有找到任何我的要求。 如果此问题已经解决,请标记重复并提供链接。 同样,我的要求是返回值,而不是调用或打印闭包内的值。
答案 0 :(得分:3)
防止它冻结你的UI的唯一方法是将它包装在backgroundQueue中但是你将无法返回一个字符串,你需要的是什么
func retrieveAccessToken(block : ((String) -> ())) {
var accessToken: String! = nil
if !accessTokenExpired(){
Network.instance.networkRequest() { value in
accessToken = value
block(accessToken)
}
} else {
accessToken = KeychainHandler.shared[ACCESS_TOKEN]!
block(accessToken)
}
}
将其命名为
self.retrieveAccessToken { (accessToken) in
//do whatever you wanna do here
}
修改强>
我认为将accessToken设为隐式可选是有意义的,因为您希望最后返回字符串。
答案 1 :(得分:0)
您需要完成,可以尝试
func retrieveAccessToken(completion: @escaping (_ str: String) -> Void){
if !accessTokenExpired(){
Network.instance.networkRequest() { value in
completion(value)
}
} else {
completion(KeychainHandler.shared[ACCESS_TOKEN]!)
}
}
//
像这样称呼
retrieveAccessToken { (token) in
// get the token
}
还要确保api调用是异步的