在Alamofire设置超时

我正在使用Alamofire 4.0.1, 我想为我的请求设置超时 。 我试过这个问题给出的解决方案:

在第一种情况下 ,它会抛出NSURLErrorDomain (正确设置超时):

let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 10 let sessionManager = Alamofire.SessionManager(configuration: configuration) sessionManager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"]) .responseJSON { response in switch (response.result) { case .success: //do json stuff break case .failure(let error): if error._code == NSURLErrorTimedOut { //timeout here } print("\n\nAuth request failed with error:\n \(error)") break } } 

在第二种情况下 ,超时不会被替换,仍然设置为60秒。

 let manager = Alamofire.SessionManager.default manager.session.configuration.timeoutIntervalForRequest = 10 manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"]) 

我在ios 10.1中运行

我的代码:(它不起作用)

  let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 10 // seconds configuration.timeoutIntervalForResource = 10 let alamoFireManager = Alamofire.SessionManager(configuration: configuration) alamoFireManager.request("my_url", method: .post, parameters: parameters).responseJSON { response in switch (response.result) { case .success: //Success.... break case .failure(let error): // failure... break } } 

解决了Alamofire github线程: Alamofire 4.3.0设置超时抛出NSURLErrorDomain错误#1931

请试试这个: –

  let request = NSMutableURLRequest(url: URL(string: "")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.timeoutInterval = 10 // 10 secs let values = ["key": "value"] request.httpBody = try! JSONSerialization.data(withJSONObject: values, options: []) Alamofire.request(request as! URLRequestConvertible).responseJSON { response in // do whatever you want here } 

我也有同样的问题,我想我找到了解决方案。 尝试声明SessionManager? 或者在你的情况下alamofireManager在类中,在函数之外

 class ViewController: UIViewController { var alamoFireManager : SessionManager? // this line func alamofire(){ let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 10 configuration.timeoutIntervalForResource = 10 alamoFireManager = Alamofire.SessionManager(configuration: configuration) // not in this line alamoFireManager.request("my_url", method: .post, parameters: parameters).responseJSON { response in switch (response.result) { case .success: //Success.... break case .failure(let error): // failure... break } } } } 

尝试这个:

  let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.timeoutIntervalForRequest = 4 // seconds configuration.timeoutIntervalForResource = 4 self.alamoFireManager = Alamofire.Manager(configuration: configuration) 

Swift 3.0

  let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 4 // seconds configuration.timeoutIntervalForResource = 4 self.alamoFireManager = Alamofire.SessionManager(configuration: configuration) 

正如马特所说,问题如下

这里的区别在于初始化的管理器不是拥有的,并且在它超出范围后不久就会被释放。 因此,任何待处理的任务都将被取消。

这个问题的解决方案是由rainypixels编写的

import Foundation导入Alamofire

 class NetworkManager { var manager: Manager? init() { let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() manager = Alamofire.Manager(configuration: configuration) } } 

还有我自己的版本

 class APIManager { private var sessionManager = Alamofire.SessionManager() func requestCards(_ days_range: Int, success: ((_ cards: [CardModel]) -> Void)?, fail: ((_ error: Error) -> Void)?) { DispatchQueue.global(qos: .background).async { let parameters = ["example" : 1] let headers = ["AUTH" : "Example"] let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 10 self.sessionManager = Alamofire.SessionManager(configuration: configuration) self.sessionManager.request(URLs.cards.value, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON { (response) in switch response.result { case .success: //do json stuff guard let json = response.result.value as? [String : Any] else { return } guard let result = json["result"] as? [[String : Any]] else { return } let cards = Mapper().mapArray(JSONArray: result) debugPrint("cards", cards.count) success?(cards) case .failure(let error): if error._code == NSURLErrorTimedOut { //timeout here debugPrint("timeOut") } debugPrint("\n\ncard request failed with error:\n \(error)") fail?(error) } } } } } 

也可以为它做一个经理

 import Alamofire struct AlamofireAppManager { static let shared: SessionManager = { let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 10 let sessionManager = Alamofire.SessionManager(configuration: configuration) return sessionManager }() } 

基于@ kamal-thakur的回复。

斯威夫特3

 var request = URLRequest(url: NSURL.init(string: "YOUR_URL") as! URL) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.timeoutInterval = 10 // 10 secs let postString = "param1=\(var1)&param2=\(var2)" request.httpBody = postString.data(using: .utf8) Alamofire.request(request).responseJSON { response in // do whatever you want here } 

经过大量的尝试,我在下一次做到了:

 var timeout = 300 // 5 minutes //Post values let parameters:Parameters = parameters //Server value let url:URL = (url) //Make the request let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForResource = TimeInterval(timeout) configuration.timeoutIntervalForRequest = TimeInterval(timeout) let sessionManager = Alamofire.SessionManager(configuration: configuration) sessionManager.request(url,parameters:parameters).validate(statusCode: 200..<300).responseJSON { response in print(response.request) // original URL request print(response.response) // URL response print(sessionManager.session.configuration.timeoutIntervalForRequest) // result of response time print(response.timeline.totalDuration) switch response.result { case .success: if let valJSON = response.result.value { //use your json result } case .failure (let error): print("\n\nAuth request failed with error:\n \(error)") } } 

我希望它有所帮助;)

我有swift的代码2.3希望它可以帮助你,尝试一下

  let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.timeoutIntervalForResource = 10800 // seconds configuration.timeoutIntervalForRequest = 10800 // seconds alamoFireManager = Alamofire.Manager(configuration: configuration) 

它对我有用:

 let url:String = "http://..." let request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("Kirk Hamet", forHTTPHeaderField:"name") request.timeoutInterval = 23 //Second Alamofire.request(request).responseJSON { response in if response.result.isSuccess == true { }else{ } } 

Swift 4.1