使用Dispatch组从闭包中返回值暂停UI

时间:2018-05-28 08:10:09

标签: ios swift grand-central-dispatch

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

2 个答案:

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