Swift 4 - 使用 PromiseKit 调用嵌套
Swift 4 - Call nests with PromiseKit
大家早上好!
我正在使用 Swift 4.2 和 Xcode10 开发一个应用程序,我使用 Alomofire 和 PromiseKit 管理调用。
有一次我需要在应用程序的开头加载一个屏幕,其中包含使用条款,但前提是他们已经更新了它。如果版本已更改,则同一个调用具有带有新端点的 URL。在最后一种情况下,该端点包含要 displayed.Therefore 的文本。我们必须打两个电话。
然后我解释一下我想做什么:
要知道他们是否更新了版本号,我打了第一个电话,并检查了我保存在设备中的最后一个版本 (NSUsserDefaults)。第一个电话 returns以下:
{ "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)
}
}
}
}
在您的第一个屏幕上,您可以在等待响应时显示 activity 指示符。收到回复后,您就可以显示相应的视图了。
为了简单起见,您可以创建一个通用方法,"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)
}
}
}
}
然后在主屏幕的 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)
}
大家早上好!
我正在使用 Swift 4.2 和 Xcode10 开发一个应用程序,我使用 Alomofire 和 PromiseKit 管理调用。
有一次我需要在应用程序的开头加载一个屏幕,其中包含使用条款,但前提是他们已经更新了它。如果版本已更改,则同一个调用具有带有新端点的 URL。在最后一种情况下,该端点包含要 displayed.Therefore 的文本。我们必须打两个电话。
然后我解释一下我想做什么:
要知道他们是否更新了版本号,我打了第一个电话,并检查了我保存在设备中的最后一个版本 (NSUsserDefaults)。第一个电话 returns以下:
{ "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)
}
}
}
}
在您的第一个屏幕上,您可以在等待响应时显示 activity 指示符。收到回复后,您就可以显示相应的视图了。
为了简单起见,您可以创建一个通用方法,"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)
}
}
}
}
然后在主屏幕的 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)
}