gpt4 book ai didi

ios - Swift 4 - 使用 PromiseKit 调用嵌套

转载 作者:行者123 更新时间:2023-11-28 05:50:25 25 4
gpt4 key购买 nike

大家早上好!

我正在使用带有 Xcode10 的 Swift 4.2 开发一个应用程序,并使用 Alomofire 和 PromiseKit 管理调用。

有一次我需要在应用程序的开头加载一个屏幕,其中包含使用条款,但前提是他们已经更新了它。如果版本已更改,则同一调用将具有包含新端点的 URL。该端点包含要显示的文本。因此,在最后一种情况下。我们必须打两个电话。

然后我解释我想做什么:

  • 要知道他们是否更新了版本号,我进行了第一次调用并检查了我保存在设备中的最后一个版本 (NSUsserDefaults)。第一次调用返回以下内容:

    { “合法版本”:“1”, “合法网址”:“http://statics.....html

  • 如果是同一个版本,我就不显示了。

  • 如果版本发生变化,我想进行第二次调用(使用包含第一次调用“legal_URL”的答案的 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)
}
}
}
}

最佳答案

在您的第一个屏幕上,您可以在等待响应时显示一个事件指示器。收到回复后,您就可以显示相应的 View 。

为了简单起见,您可以创建一个通用方法来“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)
}

关于ios - Swift 4 - 使用 PromiseKit 调用嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com