Доброе утро всем!
Я делаю приложение с 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)
}
}
}
}