3

使用 Alamofire 4.0 和 Swift 3.0 可以:

Alamofire.request("http://content.uplynk.com/player/assetinfo/ab19f0dc98dc4b7dbfcf88fa223a6c3b.json", method: .get).responseJSON {
(response) -> Void in
print("Success: \(response.result)")
}

成功:成功

但是,当我尝试使用 Sessionmanager 以便包含 timeoutInterval 时,我的请求总是失败

let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 15
let alamofireManager = Alamofire.SessionManager(configuration: configuration)   
alamofireManager.request("http://content.uplynk.com/player/assetinfo/ab19f0dc98dc4b7dbfcf88fa223a6c3b.json").validate().responseJSON { 
    response in
    print("Success: \(response.result)")
    print("Response String: \(response.result.value)")
}

成功:失败

如果有人可以在这里帮助我指出正确的方向,将不胜感激。

4

1 回答 1

14

通过打印response.result.error我得到:

Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=http://content.uplynk.com/player/assetinfo/ab19f0dc98dc4b7dbfcf88fa223a6c3b.json, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=http://content.uplynk.com/player/assetinfo/ab19f0dc98dc4b7dbfcf88fa223a6c3b.json}

这让我参考了这个:

您需要确保保留经理。这里的区别在于初始化的管理器是不拥有的,并且在它超出范围后不久就会被释放。因此,任何挂起的任务都会被取消。

解决方案:

解决您遇到的问题的一种方法是在类声明之外将自定义会话管理器声明为全局变量,如下所示......

let sessionManager: SessionManager = {
  let configuration = URLSessionConfiguration.default
  configuration.timeoutIntervalForRequest = 15

  return SessionManager(configuration: configuration)
}()

现在,在您的班级中,您可以提出请求。

class ViewController: UIViewController {

  let url = "http://content.uplynk.com/player/assetinfo/ab19f0dc98dc4b7dbfcf88fa223a6c3b.json"

  override func viewDidLoad() {
    super.viewDidLoad()

    sessionManager.request(url).validate().responseJSON { response in
      switch response.result {
        case .success:
          print(response.result.value as! NSDictionary)
          break

        case .failure:
          print(response.result.error!)
          break
      }
    }
  }

}

这会给你你正在寻找的东西。希望有帮助!

于 2016-11-24T23:28:33.323 回答