Установите тайм-аут в Alamofire
Я использую Alamofire 4.0.1 и Я хочу установить тайм-аут для моего запроса. Я пробовал решения, полученные в этом question:
В первом случае он выдает 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
}
}
Решенный поток github Alamofire: Alamofire 4.3.0 таймаут установки вызывает ошибку NSURLErrorDomain # 1931
Ответы
Ответ 1
Пожалуйста, попробуйте следующее: -
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
}
Ответ 2
Попробуйте следующее:
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)
Ответ 3
Как сказал Мэтт, проблема следующая
Разница здесь в том, что инициализированный менеджер не принадлежит и освобождается вскоре после его выхода из области видимости. В результате любые отложенные задачи отменены.
Решение этой проблемы было написано 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<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)
}
}
}
}
}
Можно также создать для него менеджер
import Alamofire
struct AlamofireAppManager {
static let shared: SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 10
let sessionManager = Alamofire.SessionManager(configuration: configuration)
return sessionManager
}()
}
Ответ 4
У меня тоже проблема, я думаю, что нашел решение. Попробуйте объявить 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
}
}
}
}
Ответ 5
после многих попыток я сделал это следующим:
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)")
}
}
Я надеюсь, что это поможет;)
Ответ 6
У меня есть код для swift 2.3 надеюсь, что он вам поможет, попробуйте
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 10800 // seconds
configuration.timeoutIntervalForRequest = 10800 // seconds
alamoFireManager = Alamofire.Manager(configuration: configuration)
Ответ 7
На основании ответа @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
}