Получить возврат значения apollo.fetch в Swift IOS (клиент Apollo) - PullRequest
0 голосов
/ 22 апреля 2020

У меня в приложении есть клиент Apollo для отправки запроса GraphQL к API. Я хочу поместить свои запросы в такой класс:

 class requestAPI {
  static func checkUsername(nameUser: String!) -> Bool{
    var res: Bool = false
    Network.shared.apollo.fetch(query: CheckUsernameQuery(username: nameUser)) { result in
      switch result {
        case .success(let response):
          res = response.data?.checkUsername
          print(“Reponse: \(response.data?.checkUsername)“)
        case .failure(let error):
          print(“Error: \(error)“)
      }
    }
    return res
  }
}

Так что я просто хочу получить значение response.data.checkUsername и вернуть его, но res всегда ложно, потому что я думаю, что выборка асинхронная. Так что же я могу сделать, чтобы получить значение response.data.checkUsername (это Bool) и вернуть его?

Спасибо всем

1 Ответ

1 голос
/ 23 апреля 2020

Кросс-постинг от Apollo Spectrum Chat :

Привет! Вам нужно будет использовать закрытие завершения следующим образом:

static func checkUsername(nameUser: String!, completion: @escaping (Bool) -> Void) {
  Network.shared.apollo.fetch(query: CheckUsernameQuery(username: nameUser)) { result in
    switch result {
    case .success(let response):
      res = response.data?.checkUsername ?? false
      completion(res)
    case .failure(let error):
      // whatever error handling you want to do
  }
}

Закрытие - это функция, которую вы передаете в качестве параметра, а затем вызываете его с результатом асинхронно, а не возвращаете результат непосредственно из функция.

Это довольно распространенный шаблон в Swift - я бы порекомендовал прочитать его. Swift do c на затворах исключительно длинный и, вероятно, слишком детализированный в качестве отправной точки, но он охватывает тонну материала. Я думаю, что лучшая часть вступительного уровня - статья Джона Санделла о замыканиях .

...