Swift 4 - Вызывайте гнезда с помощью PromiseKit - PullRequest
0 голосов
/ 06 ноября 2018

Доброе утро всем!

Я делаю приложение с Swift 4.2 с Xcode10 и звонками, которыми я управляю с Alomofire вместе с PromiseKit.

В какой-то момент мне нужно загрузить экран в начале приложения с условиями использования, но только если они обновили его. И если версия изменилась, этот же вызов имеет URL с новой конечной точкой. Эта конечная точка содержит текст для отображения. Поэтому в последнем случае. Нам нужно сделать два звонка.

Тогда я объясняю, что я хочу сделать:

  • Чтобы узнать, обновили ли они номер версии, я делаю первый вызов и проверяю последний, сохраненный в устройстве (NSUsserDefaults). Первый вызов возвращает следующее:

    {"legal_version": "1", "legal_URL": "http://statics. .... html "}

  • Если это та же версия, я не показываю экран.

  • Если версия изменилась, я хочу сделать второй вызов (с URL-адресом, на котором содержится ответ на этот первый вызов «legal_URL»)

Проблема в том, что я не знаю, как сделать двойную блокировку вызовов. Поэтому не загружайте главный экран без проверки номера версии. И не зная, придется ли мне снова показывать экран юридических терминов. И все это PromiseKit и вложенные вызовы.

Большое спасибо за помощь.

[Код обновлен]

let legalWarningRepository = LegalWarningRepository()
        firstly {
            legalWarningRepository.get(endpoint: "http://myserver.com/version")
            }.then { json in
                if let remoteVersion = json["version"] as? String, let 
                    legalUrl = json["legal_URL"] as? String, 
                    remoteVersion != localVersion {
                        return legalWarningRepository.get(endpoint: legalUrl)
            }
        }.done { json in
            if json == nil {
                // display main screen
            }
            else {
                // display legal terms
            }
        }.catch { err in
            print(err)
    }

А внутри "legalWarningViewController" у меня есть метод get, который вы мне передали:

func get(endpoint: String) -> Promise<[String: Any]> {
  return Promise { seal in
    Alamofire.request(endpoint)
      .validate()
      .responseJSON { response in
        switch response.result {
        case .success(let json):
          guard let json = json  as? [String: Any] else {
            return seal.reject(AFError.responseValidationFailed(reason: 
.dataFileNil))
          }
          seal.fulfill(json)
          case .failure(let error):
            seal.reject(error)
          }
       }
  }
}

1 Ответ

0 голосов
/ 06 ноября 2018

На первом экране вы можете отобразить индикатор активности в ожидании ответов. Если у вас есть ответы, вы можете отобразить соответствующий вид.

Для простоты вы можете создать универсальный метод, который "обещает" вызов Alamofire:

func get(endpoint: String) -> Promise<[String: Any]> {
  return Promise { seal in
    Alamofire.request(endpoint)
      .validate()
      .responseJSON { response in
        switch response.result {
        case .success(let json):
          guard let json = json  as? [String: Any] else {
            return seal.reject(AFError.responseValidationFailed(reason: .dataFileNil))
          }
          seal.fulfill(json)
          case .failure(let error):
            seal.reject(error)
          }
       }
  }
}

Тогда на вашем viewDidLoad или viewWillAppear домашнего экрана вы можете выполнить такую ​​логику:

firstly {
  get(endpoint: "http://myserver.com/version")
}.then { json in
  if let remoteVersion = json["version"] as? String, let legalUrl = json["legal_URL"] as? String, remoteVersion != localVersion {
    return get(endpoint: legalUrl)
  }
}.done { json in
  if json == nil {
    // display main screen
  }
  else {
    // display legal terms
  }
}.catch { err in
   print(error.localizedDescription)
}

В вашем случае возможен один вызов, если вы отображаете юридический термин в WKWebView.

firstly {
  get(endpoint: "http://myserver.com/version")
}.done { json in
  if let remoteVersion = json["version"] as? String, let legalUrl = json["legal_URL"] as? String, remoteVersion != localVersion {
    // display legal terms in a web view
  }
  // display main screen
}.catch { err in
   print(error.localizedDescription)
}
...