嗨,我正在尝试在 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 。有什么建议吗?
jshier于2016年10月10日发表评论
意外错误 -999 几乎总是意味着您的 SessionManager 解除分配,取消任何正在进行的请求。我建议你创建一个 您的自定义 SessionManager 的单例值,或者可能只是 重新评估您是否确实需要。
如果您为对象创建单例值,它将保留在内存中并防止释放
我避免的另一件事是给你的变量命名不同,sessionManager在Alamofire中,你的变量也被称为sessionManager。
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
}()
}
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
}()
}
我通过向自定义 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)
}()
希望这有帮助!
很可能您的 SessionManager 已被释放,从而取消了任何正在进行的请求。尝试将会话管理器实例分配给属性。
你可以试试这个。我希望它有帮助,它对我有用:
private static var alamofireManager: SessionManager?
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*/)