Использование группы рассылки для возврата значения из закрытия паузы пользовательского интерфейса - PullRequest
0 голосов
/ 28 мая 2018

Мое требование - вернуть значение из замыкания, поэтому я попробовал группу рассылки.

    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!
    }

если я не использую группу рассылки, функция возвращает ноль, если я ее использую, мой пользовательский интерфейс замораживается,Я искал много вопросов, но не нашел ни одного с моим требованием.Пожалуйста, отметьте дубликат и предоставьте ссылку, если этот вопрос уже решен.Опять же, Мое требование - вернуть значение, а не вызывать или печатать значение внутри замыкания.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Единственный способ предотвратить зависание вашего пользовательского интерфейса - это обернуть его в 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 неявным необязательным, поскольку вы ожидаете, что строка будет возвращена в конце.

0 голосов
/ 28 мая 2018

Для этого нужно завершение. Можете ли вы попробовать

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асинхронный

...