class APIClient {
var user = User()
let alamoFireManager : Alamofire.Manager?
let center = NSNotificationCenter.defaultCenter()
init(){
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 4 // seconds
configuration.timeoutIntervalForResource = 4
self.alamoFireManager = Alamofire.Manager(configuration: configuration)
}
func test(){
//This does not respect the 4 second time out. Why?
self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
(req, res, json, error) in
if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
}
}
}
risposta
Sei sicuro che il timeout di 4 secondi non viene applicato? Ho creato un esperimento:
let center = NSNotificationCenter.defaultCenter()
var alamoFireManager : Alamofire.Manager?
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 4 // seconds
configuration.timeoutIntervalForResource = 4
self.alamoFireManager = Alamofire.Manager(configuration: configuration)
self.alamoFireManager!.request(.POST, "http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/2", parameters: nil).responseJSON {
(req, res, json, error) in
println("First json \(json)")
println("First error \(error)")
}
self.alamoFireManager!.request(.POST, "http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6", parameters: nil).responseJSON {
(req, res, json, error) in
println("Second \(json)")
println("Second \(error)")
}
e l'output della console che ho ottenuto:
First json Optional({
name = timeoutTest;
value = 2;
})
First error nil
Second nil
Second Optional(Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x7f91dc8223e0 {NSErrorFailingURLKey=http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6, NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=http://oznet.go.ro/iDorMobile/ConfigServer/api.php/timeout/6})
Gli URL dal mio esempio sono attualmente giù, cercherò di metterli di nuovo online. È possibile utilizzare gli URL dell'esempio per testare. Impostando un numero diverso alla fine è possibile modificare il timeout (in secondi).
Ho usato i cocoapodi ultima versione di Alamofire.
Swift 3/aprile 2017: dovrebbe essere 'Alamofire.SessionManager', e' URLSessionConfiguration.default' – xaphod
init(){
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 4
configuration.timeoutIntervalForRequest = 4
self.alamoFireManager = Alamofire.Manager(configuration: configuration)
self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
(req, res, json, error) in
if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
}
}
}
Uso self.alamoFireManager!.request
nella stessa funzione init, ritardo di timeout è soltanto per la richiesta non per l'intera funzione. può essere che può aiutare.
È necessario creare una variabile globale per la richiesta di manager:
var alamoFireManager = Alamofire.Manager.sharedInstance
e dopo configurare i parametri personalizzati:
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 4 // seconds
configuration.timeoutIntervalForResource = 4
self.alamoFireManager = Alamofire.Manager(configuration: configuration)
ha funzionato per me, grazie –
Ecco il codice Swift 3.0/Alamofire 4.0 per ottenere un alamofireManager che ha un timeout di 5 secondi:
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForResource = 5 // seconds
let alamofireManager = Alamofire.SessionManager(configuration: configuration)
In caso di Alamofire 4.0 Alamofire.Manager è stato modificato in Alamofire.SessionManager come indicato da @Jamie –
Immagino che questo funzioni per voi, si noti che si deve dichiarare un'istanza di Alamofire.Manager di fuori della funzione, si prega di vedere sotto il codice
//Declare it out side the function
var alamoFireManager : Alamofire.Manager!
func callUrl() {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 10800 // seconds
configuration.timeoutIntervalForRequest = 10800 // seconds
alamoFireManager = Alamofire.Manager(configuration: configuration)
alamoFireManager.request(.POST, url, parameters: dir as? [String : AnyObject], encoding: .JSON, headers: [ "Content-Type": "application/json"])
.responseJSON { response in
}
}
speranza che questo ti aiuta
posso confermare che questo non funzionerà se l'istanza di alamofire manager è dichiarata all'interno della funzione. –
ho avuto NSURLErrorDomain quando ho usato metodo di cui sopra. Questo è il mio codice (swift 3.2/Alamofire 4,4)
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 4
manager.request(.POST, CONSTANTS.APIEndpoint+"/test", parameters: parameters).responseJSON {
(req, res, json, error) in
if let json = self.handleAPIResponse(req, res: res, json_data: json, error: error){
}
impostare un punto di interruzione alla test' funzione 'e stampare il' self.alamoFireManager! .session.configuration.timeoutIntervalForRequest' – Bannings
Stai supponendo che la prima volta chiami il metodo test(), dovrebbe avere un ritardo di 4 secondi? – Orion
Il ritardo è per la richiesta http non per il metodo di prova completo. Ad esempio, la dose di timeout non si applica alla tua chiamata handleAPIResponse. – alinoz