ios - 超时请求后如何返回上一屏幕?

标签 ios swift nsurlsession nsurlsessionconfiguration

我正在尝试将网络 session 创建者设置为在超时请求超时时返回到上一个屏幕。到目前为止,我还不完全确定在哪里或如何执行它。这是代码:

  lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default

  lazy var session: URLSession = URLSession(configuration: self.configuration)

 typealias JSONData = ((Data) -> Void)

  func getJSONData(type: String, urlExtension: String, completion: @escaping JSONData) {

    configuration.timeoutIntervalForRequest = 5
    configuration.timeoutIntervalForResource = 5

    let request = URLRequest(url: URL(string:"\(baseURL)\(type)/\(urlExtension)?api_key=\(apiKey)")! )

    let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) in

      if error == nil {
        if let httpResponse = response as? HTTPURLResponse {
          switch (httpResponse.statusCode) {
          case 200:
            if let data = data {
              completion(data)
            }
          default:
            print(httpResponse.statusCode)
          }
        }
      } else {
        print("Error: \(error?.localizedDescription)")
      }
    })
    dataTask.resume()
  }

最佳答案

 lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default

  lazy var session: URLSession = URLSession(configuration: self.configuration)

 typealias JSONData = ((Data) -> Void)

  func getJSONData(type: String, urlExtension: String, onSucceed : @escaping JSONData ,  onFailure: @escaping (_ error:NSError)-> Void ) {

    configuration.timeoutIntervalForRequest = 5
    configuration.timeoutIntervalForResource = 5

    let request = URLRequest(url: URL(string:"\(baseURL)\(type)/\(urlExtension)?api_key=\(apiKey)")! )

    let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) in

      if error == nil {
        if let httpResponse = response as? HTTPURLResponse {
          switch (httpResponse.statusCode) {
          case 200:
            if let data = data {
              onSucceed(data)
            }
          default:
            print(httpResponse.statusCode)
          }
        }
      } else {
        onFailure(error! as NSError)
      }
    })
    dataTask.resume()
  }

在调用此方法的 View Controller 中,我将像这样使用它。

NetworkManager.getJSONData(type: "", urlExtension: "",onSucceed {
   //doSmth
}, on Failure{(error) in 
   //show Error
// if it is pushed
    _ = self.navigationController?.popViewController(animated: true) 

// or if its presented 
// self.navigationController?.dismiss(animated: true, completion: nil)

}

关于ios - 超时请求后如何返回上一屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788013/

相关文章:

objective-c - 使用 UISegmentedControl 切换到 MKMapView 和 UITableView

swift - 如何在 NSURLSession 中使用 PUT 方法向 HTTPBody 添加数据?

ios - 多个按钮未出现在 UICollectionViewCell 中

objective-c - 在 Swift 中实现 RCTEventEmitter 但未设置桥接异常

swift - 从不同的 ViewController 更改 UIButton

ios - AVPlayer 和 MPMoviePlayerController 不能被静音 --- 强制背景音频变暗

http - iOS9 - HTTP 连接错误

ios - 单例类中的 Swift REST API 调用和协议(protocol)的使用

ios - Realm - 如何确保数据库不会被删除

iphone - 生产版 iPhone 应用程序崩溃并显示 "putpkt: write failed: Broken pipe"?