一旦Alamofire无效,如何重新验证会话?

时间:2016-08-25 04:06:16

标签: ios swift session alamofire tvos

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

它不起作用。

1 个答案:

答案 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()
}