2015-06-28 22 views
39
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){ 
         } 
        } 
    } 
+1

impostare un punto di interruzione alla test' funzione 'e stampare il' self.alamoFireManager! .session.configuration.timeoutIntervalForRequest' – Bannings

+0

Stai supponendo che la prima volta chiami il metodo test(), dovrebbe avere un ritardo di 4 secondi? – Orion

+0

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

risposta

36

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.

+1

Swift 3/aprile 2017: dovrebbe essere 'Alamofire.SessionManager', e' URLSessionConfiguration.default' – xaphod

3
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.

9

È 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) 
+1

ha funzionato per me, grazie –

8

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) 
+0

In caso di Alamofire 4.0 Alamofire.Manager è stato modificato in Alamofire.SessionManager come indicato da @Jamie –

6

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

+0

posso confermare che questo non funzionerà se l'istanza di alamofire manager è dichiarata all'interno della funzione. –

1

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){ 
        } 
Problemi correlati