Ios 在Alamofire中设置超时
我正在使用Alamofire 4.0.1,我想为我的请求设置一个超时时间。我尝试了以下给出的解决方案: 在第一种情况下,它抛出一个nsurErrorDomain(超时设置正确): 在第二种情况下,超时不会被替换,仍然设置为60秒Ios 在Alamofire中设置超时,ios,swift,alamofire,Ios,Swift,Alamofire,我正在使用Alamofire 4.0.1,我想为我的请求设置一个超时时间。我尝试了以下给出的解决方案: 在第一种情况下,它抛出一个nsurErrorDomain(超时设置正确): 在第二种情况下,超时不会被替换,仍然设置为60秒 let manager = Alamofire.SessionManager.default manager.session.configuration.timeoutIntervalForRequest = 10 manager.request("yourUrl",
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 10
manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])
我正在使用ios 10.1运行
我的代码:(它不工作)
解决了Alamofire github线程:尝试以下操作:
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)
我有swift 2.3的代码,希望它能帮助你,试试看
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 10800 // seconds
configuration.timeoutIntervalForRequest = 10800 // seconds
alamoFireManager = Alamofire.Manager(configuration: configuration)
请试试这个:-
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
}
经过多次尝试,我成功地实现了以下目标:
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)")
}
}
var超时=300//5分钟
//岗位价值
let参数:参数=参数
//服务器值
让url:url=(url)
//提出请求
let configuration=URLSessionConfiguration.default
configuration.timeoutitervalforresource=时间间隔(超时)
configuration.timeoutitervalforrequest=时间间隔(超时)
让sessionManager=Alamofire.sessionManager(配置:配置)
sessionManager.request(url,参数:parameters).validate(状态码:200..正如Matt所说,问题如下
这里的区别在于初始化的管理器不是所有者,在它超出范围后很快就会被释放。因此,任何挂起的任务都会被取消
这个问题的解决方案是由rainypixels编写的
进口基础
进口阿拉莫菲尔
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<CardModel>().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)
}
}
}
}
}
基于@kamal thakur的回应
Swift 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)¶m2=\(var2)"
request.httpBody = postString.data(using: .utf8)
Alamofire.request(request).responseJSON {
response in
// do whatever you want here
}
我也有同样的问题,我想我找到了解决办法。试着在类中声明SessionManager?
或者在函数之外声明AlamoFileManager
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 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如果您不想自己构建URL请求,您仍然可以使用Alamofire来构建它
// set this flag to false so the request will not be sent until
// resume() is called
sessionManager.startRequestsImmediately = false
var urlRequest = sessionManager.request(url,
method: method,
parameters: params,
encoding: encoding,
headers: allHeaders).request!
urlRequest.timeoutInterval = 10
let request = sessionManager.request(urlRequest).responseJSON { (result) in
// use the result
}
// need to start the request
request.resume()
以上这些都不适用于我:我在swift4.2
alamofire4.5
//MARK: - Session Manager
private static var alamofireManager: Session? = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 10
let alamofireManager = Session(configuration: configuration)
return alamofireManager
}()
我是这样解决的:
let request=Alamofire.request(“routee”,方法:.post,参数:数据,编码:JSONEncoding.default,headers:getHeaders())
///获取Alamofire创建的请求,然后更新其超时值
让url=url(字符串:“myroute”)!
var-request=try-URLRequest(url:url,method:method,headers:headers)
request.timeoutInterval=900//超时
request=尝试JSONEncoding.default.encode(请求,带:数据)
Alamofire.request(请求)
.responseJSON{中的响应
}
如果您使用的是Alamofire的一个实例,您可以创建如下的惰性变量:
private lazy var alamoFireManager: SessionManager? = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 5
configuration.timeoutIntervalForResource = 5
let alamoFireManager = Alamofire.SessionManager(configuration: configuration)
return alamoFireManager
}()
根据Letaief Achraf的回答,在Swift 4.2上运行,但在Swift 5.0和Alamofire吊舱版本=5.0上运行
//MARK: - Session Manager
private static var alamofireManager: Session? = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 10
let alamofireManager = Session(configuration: configuration)
return alamofireManager
}()
在apimager
或类似文件中使用此变量。Alamofire 5.1包含了一种新方法,可通过初始值设定项中的闭包修改请求:
AF.request(url){$0.timeoutInterval=60}
.validate()
.response{in//handle response here}
在Swift 5中。您可以这样做
AF.sessionConfiguration.timeoutIntervalForRequest = 60
您正在设置请求超时,请改为设置资源超时。timeoutitervalforresource
似乎不起作用,我用实际代码进行了更新。结果与第一种情况相同。将var-AlamoFileManager:Alamofire.Manager!作为全局名称结果,而不是第一种情况。@ƒernandovale,而不是编辑其他人的答案,您应该这样做吗将更改合并到您的问题中或创建自己的asnwer。@LotPings我更新了我的问题并更新了此代码,因为很容易检查是否有错误。您的回答和Jason的有什么区别?嗯,我似乎遇到了此错误:无法将“NSMutableURLRequest”类型的值强制转换为“Alamofire.UrlRequestConverable”。请重试“var request=URLRequest(url:url)”而不是“let request=NSMutableURLRequest(url:url)”工作起来像个champ!!尝试声明SessionManager?或者在类中声明AlamoFileManager,在你保存my day bro的函数之外。最佳答案(Y)。
//MARK: - Session Manager
private static var alamofireManager: Session? = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 10
let alamofireManager = Session(configuration: configuration)
return alamofireManager
}()
AF.sessionConfiguration.timeoutIntervalForRequest = 60