web-dev-qa-db-fra.com

AlamoFire ne respecte pas l'intervalle de temporisation

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){
                        }
                    }
    }
41
TIMEX

Êtes-vous sûr que le délai d'expiration de 4 secondes n'est pas appliqué? J'ai créé une expérience:

    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)")
    }

et la sortie de la console que j'ai obtenue:

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})

Les URL de mon exemple sont actuellement en baisse, je vais essayer de les remettre en ligne. Vous pouvez utiliser les URL de l'exemple pour tester. En définissant un nombre différent à la fin, vous pouvez modifier le délai d'expiration (en secondes).

J'ai utilisé la dernière version des cocoapods d'Alamofire.

37
alinoz

Vous devez créer une variable globale pour le gestionnaire de demandes:

var alamoFireManager = Alamofire.Manager.sharedInstance

Et après avoir configuré les paramètres personnalisés:

 let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForRequest = 4 // seconds
    configuration.timeoutIntervalForResource = 4
    self.alamoFireManager = Alamofire.Manager(configuration: configuration)
9
Dab88

Voici le code Swift 3.0/Alamofire 4.0 pour obtenir un alamofireManager qui a un délai d'expiration de 5 secondes:

    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForResource = 5 // seconds

    let alamofireManager = Alamofire.SessionManager(configuration: configuration)
8
Jamie McCrindle

Je suppose que celui-ci fonctionne pour vous, notez que vous devez déclarer l'instance de Alamofire.Manager en dehors de la fonction, veuillez voir le code ci-dessous

//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
    }
}

j'espère que cela vous aide

6
Patel Jigar
 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){
                    }
                }
}

Utilisation self.alamoFireManager!.request dans la même fonction init, la temporisation n'est valable que pour la requête et non pour la fonction entière. peut-être que cela peut aider.

3
Faran Ghani

J'ai obtenu NSURLErrorDomain lorsque j'ai utilisé la méthode ci-dessus. Ceci est mon code (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){
                    }
1
Leibniz