Swift 4-使用PromiseKit呼叫巢穴



大家早上好!

我正在用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)
}
}
}
}

在您的第一个屏幕上,您可以在等待响应时显示活动指示器。当您收到回复后,您可以显示相应的视图。

为了保持简单,您可以创建一个通用方法来"promisify"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)
}
}
}
}

然后在主屏幕的viewDidLoadviewWillAppear中,您可以执行这种逻辑:

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

最新更新