AlamoFire does not respect timeout interval

前端 未结 6 1883
离开以前
离开以前 2021-02-01 14:03
class APIClient {
    var user = User()
    let alamoFireManager : Alamofire.Manager?
    let center = NSNotificationCenter.defaultCenter()


    init(){
        let con         


        
相关标签:
6条回答
  • 2021-02-01 14:08

    You need create a global variable for the request manager:

    var alamoFireManager = Alamofire.Manager.sharedInstance
    

    And after configure the custom parameters:

     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.timeoutIntervalForRequest = 4 // seconds
        configuration.timeoutIntervalForResource = 4
        self.alamoFireManager = Alamofire.Manager(configuration: configuration)
    
    0 讨论(0)
  • 2021-02-01 14:12

    Are you sure that the 4 seconds timeout is not enforced? I have created an experiment:

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

    and the console output i got:

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

    The URLs from my example are currently down, i will try to put them back online. You can use the urls from the example to test. By setting a different number at the end you can modify the timeout (in seconds).

    I have used the cocoapods last version of Alamofire.

    0 讨论(0)
  • 2021-02-01 14:16
     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){
                        }
                    }
    }
    

    Use self.alamoFireManager!.request in the same init function , timeout delay is only for the request not for the whole function. may be it can help.

    0 讨论(0)
  • 2021-02-01 14:17

    I guess this one works for you, note that you have to declare instance of Alamofire.Manager outside the function, please see below code

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

    hope this helps you

    0 讨论(0)
  • 2021-02-01 14:21

    Here's the Swift 3.0 / Alamofire 4.0 code to get an alamofireManager that has a 5 second timeout:

        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForResource = 5 // seconds
    
        let alamofireManager = Alamofire.SessionManager(configuration: configuration)
    
    0 讨论(0)
  • 2021-02-01 14:32

    I got NSURLErrorDomain when I used above method . This is my 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){
                        }
    
    0 讨论(0)
提交回复
热议问题