【问题标题】:Set timeout in Alamofire在 Alamofire 中设置超时
【发布时间】:2017-06-07 19:34:33
【问题描述】:

我正在使用 Alamofire 4.0.1 并且 我想为我的请求设置超时。我尝试了question中给出的解决方案:

第一种情况,它会抛出一个NSURLErrorDomain(超时设置正确):

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

第二种情况,不替换超时,仍然设置为60秒。

let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 10

manager.request("yourUrl", method: .post, parameters: ["parameterKey": "value"])

我在 ios 10.1 中运行

我的代码:(不起作用)

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

已解决 Alamofire github 线程: Alamofire 4.3.0 setting timeout throws NSURLErrorDomain error #1931

【问题讨论】:

  • 您正在设置 Request Time Out ,改为设置 Resource Timeout 。 timeoutIntervalForResource
  • 好像不行,我用我的实际代码更新了。

标签: ios swift alamofire


【解决方案1】:

有关新版本的 AF,请参阅https://stackoverflow.com/a/61192412/308315


对于旧版本,请尝试以下操作:

    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
    }

【讨论】:

  • 嗯,我似乎收到了这个错误:无法将“NSMutableURLRequest”类型的值转换为“Alamofire.URLRequestConvertible”。
  • 尝试 'var request = URLRequest(url: url)' 而不是 'let request = NSMutableURLRequest(url: url)'
  • 像冠军一样工作!!
【解决方案2】:

我也有同样的问题,我想我找到了解决方案。尝试在函数外部的类中声明SessionManager?或在您的情况下为alamofireManager

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

}

【讨论】:

  • 尝试声明 SessionManager?或者在你的情况下,在函数之外的类中声明 alamofireManager
  • 兄弟,你拯救了我的一天。最佳答案 (Y)。
【解决方案3】:

Alamofire 5.1 包含一种在初始化程序中使用闭包修改请求的新方法:

AF.request(url) { $0.timeoutInterval = 60 }
    .validate()
    .response { _ in // handle response here }

【讨论】:

    【解决方案4】:

    如果您使用的是 Alamofire 的一个实例,您可以像这样创建一个惰性变量:

       private lazy var alamoFireManager: SessionManager? = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 5
        configuration.timeoutIntervalForResource = 5
        let alamoFireManager = Alamofire.SessionManager(configuration: configuration)
        return alamoFireManager
    
    }()
    

    适用于 Swift 4.2

    【讨论】:

      【解决方案5】:

      试试这个:

          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)
      

      【讨论】:

      • 与第一种情况相同的结果。
      • @ƒernandoValle 而不是编辑其他人的答案,您应该将更改合并到您的问题中或创建自己的答案。
      • @LotPings 我更新了我的问题并更新了这段代码,因为很容易检查是否有任何错误。
      【解决方案6】:

      正如马特所说,问题如下

      这里的区别在于初始化的管理器是不拥有的,并且在它超出范围后不久就会被释放。因此,所有待处理的任务都会被取消。

      这个问题的解决方案是rainypixels写的

      导入基础 进口阿拉莫火

      class NetworkManager {
      
          var manager: Manager?
      
          init() {
              let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
              manager = Alamofire.Manager(configuration: configuration)
          }
      }
      

      还有我自己的版本

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

      也可以给它做个经理

      import Alamofire
      
      struct AlamofireAppManager {
      
          static let shared: SessionManager = {
              let configuration = URLSessionConfiguration.default
              configuration.timeoutIntervalForRequest = 10
              let sessionManager = Alamofire.SessionManager(configuration: configuration)
              return sessionManager
          }()
      
      }
      

      【讨论】:

        【解决方案7】:

        基于@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)&param2=\(var2)"
        request.httpBody = postString.data(using: .utf8)
        Alamofire.request(request).responseJSON {
            response in
            // do whatever you want here
        }
        

        【讨论】:

          【解决方案8】:

          基于 Letaief Achraf 的回答,但针对 Swift 5.0Alamofire pod version &gt;= 5.0.0

          //MARK: - Session Manager
          private static var alamofireManager: Session? = {
              let configuration = URLSessionConfiguration.default
              configuration.timeoutIntervalForRequest = 10
              let alamofireManager = Session(configuration: configuration)
              return alamofireManager
          }()
          

          APIManager 或类似名称中使用此变量。

          【讨论】:

            【解决方案9】:

            在 Swift 5 中。你可以这样做。

            AF.sessionConfiguration.timeoutIntervalForRequest = 60
            

            【讨论】:

              【解决方案10】:

              经过多次尝试,我成功了:

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

              希望对你有帮助;)

              【讨论】:

              【解决方案11】:

              以上都不适合我:我在 swift 4.2 Alamofire 4.5

              我设法像这样解决它:

              let request = Alamofire.request("routee", method: .post, parameters: data, encoding: JSONEncoding.default, headers: getHeaders())
              
              /// getting request created by Alamofire and then updating its timeout Value
              
              let url = URL(string: "myroute")!
                      var request = try URLRequest(url: url, method: method, headers: headers)
                      request.timeoutInterval = 900 // timeout
                      request = try JSONEncoding.default.encode(request, with: data)
              
              Alamofire.request(request)
                  .responseJSON { response in
              
              }
              

              【讨论】:

                【解决方案12】:

                我有 swift 2.3 的代码,希望对你有帮助,试试吧

                    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
                    configuration.timeoutIntervalForResource = 10800 // seconds
                    configuration.timeoutIntervalForRequest = 10800 // seconds
                
                    alamoFireManager = Alamofire.Manager(configuration: configuration)
                

                【讨论】:

                • 与第一种情况相同的结果。
                • var alamoFireManager : Alamofire.Manager! 视为全局
                【解决方案13】:

                这对我有用:

                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

                【讨论】:

                  【解决方案14】:

                  如果你不想自己构建一个 UrlRequest,你仍然可以使用 Alamofire 来构建它。

                      // set this flag to false so the request will not be sent until
                      // resume() is called
                      sessionManager.startRequestsImmediately = false
                  
                      var urlRequest = sessionManager.request(url,
                                                              method: method,
                                                              parameters: params,
                                                              encoding: encoding,
                                                              headers: allHeaders).request!
                  
                      urlRequest.timeoutInterval = 10
                  
                      let request = sessionManager.request(urlRequest).responseJSON { (result) in
                          // use the result
                      }
                  
                      // need to start the request
                      request.resume()
                  

                  【讨论】:

                    【解决方案15】:

                    基于最新版本 5.4.4,您可以像这样设置超时:

                    AF.request("https://stackoverflow.com", requestModifier: { $0.timeoutInterval = 5 }).response(...)
                    

                    Here's the documentation.

                    例子:

                    let url = URL(string: "https://stackoverflow.com")
                    
                    AF.request(url, method: .get, requestModifier: { $0.timeoutInterval = .infinity }).validate().responseData { response in
                        // Do something with the response ...
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-06-25
                      • 1970-01-01
                      • 2021-01-26
                      • 2018-04-04
                      • 1970-01-01
                      • 2018-12-12
                      • 1970-01-01
                      • 2020-04-15
                      • 2021-10-05
                      相关资源
                      最近更新 更多