Alamofire 4.7 中的自定义 SessionManager 立即取消

问题描述 投票:0回答:4

嗨,我正在尝试在 Alamofire 中创建一个自定义 SessionManager 以更改默认的 timeoutIntervalForRequest 值。我正在使用下面的代码:

  let configuration=URLSessionConfiguration.default
  configuration.timeoutIntervalForRequest=20
  let sessionManager=Alamofire.SessionManager(configuration:configuration)

  sessionManager.request("my url", method: .post, parameters: params, encoding: JSONEncoding.default, headers: header)
        .responseJSON(completionHandler: { (response) in
                  if response.result.isSuccess{
                     //here goes the rest of my code
                   }
            }
               else{
                    //here goes the connection error part
                   }
            })

问题是我总是收到错误部分,当我在错误部分打印响应时,它看起来像这样:

已完成,但出现错误 - 代码:-999

失败:错误域=NSURLErrorDomain代码=-999“已取消”

好像我的请求立即取消了。如果我将 sessionManager 更改为默认管理器 Alamofire,它可以正常工作,但我需要更改 timeoutIntervalForRequest 值。我正在使用 Xcode 9.3 和 swift 4 和 Alamofire 4.7.2 。有什么建议吗?

ios alamofire swift4
4个回答
9
投票

我在 Alamofire 存储库问题

中找到了解决方案

jshier于2016年10月10日发表评论

意外错误 -999 几乎总是意味着您的 SessionManager 解除分配,取消任何正在进行的请求。我建议你创建一个 您的自定义 SessionManager 的单例值,或者可能只是 重新评估您是否确实需要。

如果您为对象创建单例值,它将保留在内存中并防止释放

我避免的另一件事是给你的变量命名不同,sessionManager在Alamofire中,你的变量也被称为sessionManager。

阿拉莫火 4.7,斯威夫特 4

import Alamofire

class Networking {

  public static let sharedManager: SessionManager = {
      let configuration = URLSessionConfiguration.default
      configuration.timeoutIntervalForRequest=20
      let manager = Alamofire.SessionManager(configuration: configuration, delegate: SessionManager.default.delegate)
      return manager
  }()
}

Alamofire 5.0.0-beta.6,Siwft 5.1

import Alamofire

class Networking {

  static let APIManager: Session = {
      let configuration = URLSessionConfiguration.default
      configuration.timeoutIntervalForRequest = 20
      let delegate = Session.default.delegate
      let manager = Session.init(configuration: configuration,
                                 delegate: delegate,
                                 startRequestsImmediately: true,
                                 cachedResponseHandler: nil)
      return manager
  }()
}

2
投票

我通过向自定义 Alamofire 会话管理器添加额外的标头解决了这个问题:

static let sessionManager: Alamofire.SessionManager = {
        let config = URLSessionConfiguration.default
        config.timeoutIntervalForRequest = 10
        config.timeoutIntervalForResource = 10
        config.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders

        return Alamofire.SessionManager(configuration: config) 
}()

希望这有帮助!


0
投票

很可能您的 SessionManager 已被释放,从而取消了任何正在进行的请求。尝试将会话管理器实例分配给属性。

检查 https://github.com/Alamofire/Alamofire/issues/1684


0
投票

你可以试试这个。我希望它有帮助,它对我有用:

全局变量

private static var alamofireManager: SessionManager?

在执行方法中使用 defer 在范围结束时终止会话

let configuration = URLSessionConfiguration.default     
configuration.timeoutIntervalForRequest = timeout
let alamofireManager = SessionManager(configuration: configuration)
self.alamofireManager = alamofireManager

defer {
 self.alamofireManager?.session.finishTasksAndInvalidate()
 self.alamofireManager?.session.invalidateAndCancel()        
}

self.alamofireManager?.request(/* Your request parameters*/)
© www.soinside.com 2019 - 2024. All rights reserved.