使用invalidateAndCancel()会出现另一个问题,即如果您需要再次使用它,请重新初始化会话。在搜索了这个问题之后,我得到了Cnoon的Alamofire Background Service, Global Manager? Global Authorisation Header?答案。尝试创建管理器但是当它被调用时它永远不会重新初始化值,为了预测这个问题,我做了一个小小的欺骗,我试着每次给我的会话新名字。
func reset() -> Manager {
let configuration: NSURLSessionConfiguration = {
let identifier = "com.footbits.theartgallery2.background-session\(sessionCount)"
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(identifier)
return configuration
}()
return Alamofire.Manager(configuration: configuration)
}
func cancelAllRequests() {
manager.session.invalidateAndCancel()
sessionCount += 1
manager = reset()
}
现在我很好奇背景中发生的事情,比如之前的会话仍然存在或已被alamofire删除,因为如果它仍然存在,我可以创建多少会话以及后续影响是什么?因为我试过了:
manager.session.resetWithCompletionHandler {
print("Session reset")
}
它不起作用。
答案 0 :(得分:0)
我知道这个问题很旧,但是无论您是否使用Alamofire,此信息都将适用于您(读者)。
您不能出于以下原因重新验证URLSession:会话中的任务将被告知在会话无效时取消。但是,这些任务可能需要一段时间才能真正取消并退出会话。为了证明这一点,请取消会话并随后定期检索其任务。它们会慢慢降为零。
您需要做的是使用新标识符创建一个新会话。 使用相同的标识符将导致使用旧会话,如果计划了新任务,则崩溃!
对于那些希望进行后台下载的用户,请考虑使用UUID().uuidString
作为标识符的一部分,并将ID存储在设备上的某个位置(会想到Userdefaults),并在每次调用后生成新的uuid以使您的当前版本无效会议。然后使用新的uuid创建一个新的会话对象,并引用它。奖励:这个新会话将立即有0个未完成的任务,如果您的逻辑基于此,这将非常有用。
我的项目中的示例:
@UserDefaultOptional(defaultValue: nil, "com.com.company.sessionid")
private var sessionID: String?
// MARK: - Init
private var session: URLSession!
private override init() {
super.init()
setupNewSession()
}
private func setupNewSession() {
let id = sessionID ?? UUID().uuidString
sessionID = id
let configuration = URLSessionConfiguration.background(withIdentifier: id)
session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}
private func invalidateSession() {
session.invalidateAndCancel()
sessionID = nil
setupNewSession()
}