使用调度组从关闭返回值会暂停 UI



我的要求是从闭包中返回值,所以我尝试了调度组。

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 就会冻结。 我搜索了很多问题,但没有找到任何符合我要求的问题。 如果此问题已解决,请标记重复并提供链接。 同样,我的要求是返回值,而不是调用或打印闭包中的值。

防止它冻结您的 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 作为隐式可选是有意义的,因为您希望在末尾返回字符串。

你需要完成,你能试试吗

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 调用是异步的

最新更新