Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Dispatch group从UI返回值_Ios_Swift_Grand Central Dispatch - Fatal编程技术网

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以返回值,但不会冻结主应用程序流。我是否遗漏了一点?我已经提到,“我的要求是返回值,而不是在闭包中调用或打印值。”。我不想用闭包来发送值这是异步的