J'utilise Alamofire 4.0.1 et Je souhaite définir un délai d'expiration pour ma demande. J'ai essayé les solutions présentées dans cette question :
Dans le premier cas, il lance un NSURLErrorDomain (le délai est correctement défini):
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
}
}
Dans le second cas, la temporisation n'est pas remplacée et reste fixée à 60 secondes.
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 10
manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])
Je cours sous iOS 10.1
Mon code: (ça ne marche pas)
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
}
}
Résolution du thread github Alamofire:Le délai d'attente de configuration d'Alamofire 4.3.0 génère l'erreur NSURLErrorDomain n ° 1931
Basé sur la réponse @ 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
}
S'il vous plaît essayez ceci: -
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
}
J'ai le même problème aussi, je pense avoir trouvé la solution. Essayez de déclarer SessionManager?
ou dans votre cas alamofireManager
en classe, en dehors de la fonction
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
}
}
}
}
Essaye ça:
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)
Comme Matt a dit le problème est le suivant
La différence ici est que le gestionnaire initialisé n'est pas détenu et est désalloué peu de temps après sa sortie du champ d'application. Par conséquent, toutes les tâches en attente sont annulées.
La solution à ce problème a été écrite par Rainypixels
import Foundation import Alamofire
class NetworkManager {
var manager: Manager?
init() {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
manager = Alamofire.Manager(configuration: configuration)
}
}
Et ma propre version
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)
}
}
}
}
}
Peut aussi faire un manager pour ça
import Alamofire
struct AlamofireAppManager {
static let shared: SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 10
let sessionManager = Alamofire.SessionManager(configuration: configuration)
return sessionManager
}()
}
après beaucoup d'essais je l'ai fait le lendemain:
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)")
}
}
J'espère que ça aide;)
j'ai du code pour Swift 2.3 j'espère que ça vous aide, essayez-le
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 10800 // seconds
configuration.timeoutIntervalForRequest = 10800 // seconds
alamoFireManager = Alamofire.Manager(configuration: configuration)
Cela fonctionne pour moi:
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