Swift 4 - 使用 PromiseKit 调用嵌套

Swift 4 - Call nests with PromiseKit

大家早上好!

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

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

然后我解释一下我想做什么:

他的问题是我不知道如何进行双重调用阻塞。所以不要在没有检查版本号的情况下加载主屏幕。而且不知道我是否必须再次显示法律条款屏幕。 而这一切都是 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)
          }
       }
  }
}

然后在主屏幕的 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)
}