Ios 使用Dispatch group从UI返回值
我的要求是从闭包返回值,所以我尝试了调度组Ios 使用Dispatch group从UI返回值,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我的要求是从闭包返回值,所以我尝试了调度组 func retrieveAccessToken()->String { var accessToken: String? let group = DispatchGroup() if !accessTokenExpired(){ Network.instance.networkRequest() { value in accessToken =
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就会冻结。
我搜索了很多问题,但没有找到符合我要求的问题。
如果这个问题已经解决,请标记重复并提供链接。
同样,我的要求是返回值,而不是调用或打印闭包中的值。您需要完成此操作,可以尝试吗
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调用是异步的防止它冻结您的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设为隐式可选是有意义的,因为您希望字符串在末尾返回。您需要向retrieveAccessToken函数传递一个闭包。您不能在不阻塞主线程的情况下等待主线程完成请求。@AbhinavJha如果这是唯一的要求,那么您需要了解diff b/w
synchronous
和asynchronous
@SandeepBhandari,我已经提到,“我的要求是返回值,而不是调用或打印闭包内的值。”。我不想用闭包发送邮件value@abhinav-jha:我们的意思是,在您的案例中,您不能从异步函数返回Network.instance.networkRequest是异步调用,您正在使用dispatch group使其同步,这将阻止您的UI,但如果您将其包装在backgroundQueue中,DispatchQueue.background将以闭包作为参数,您无法从块返回值。您需要块吗?因此无法在闭包之外返回值?谢谢您的帮助,我将遵循闭包方法。@abhinav jha:Nope buddy,抱歉,没有其他方法我刚才在notify(队列:.main)中使用了completionhandler以返回值,但不会冻结主应用程序流。我是否遗漏了一点?我已经提到,“我的要求是返回值,而不是在闭包中调用或打印值。”。我不想用闭包来发送值这是异步的