会话失效后如何重新验证会话 Alamofire?

Posted

技术标签:

【中文标题】会话失效后如何重新验证会话 Alamofire?【英文标题】:How to revalidate the session once it is invalidated Alamofire? 【发布时间】:2016-08-25 04:06:15 【问题描述】:

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

它不起作用。

【问题讨论】:

因为在那个特定的时刻我希望它完成并且有可能下次我会从一个新的请求开始。 所以我已经尝试过它永远不会立即生效。我不知道这背后的科学是什么。此外,Cnoon 的回答:***.com/questions/32999892/… 鼓励我们通过使会话无效来做到这一点,是的,它也可以工作。你能分享一下你是如何推荐它的吗? 【参考方案1】:

我知道这个问题很老,但无论您是否使用 Alamofire,此信息都将适用于您(读者)。

您不能重新验证 URLSession,原因很充分:会话中的任务将被告知在会话无效时取消。但是,这些任务可能需要一段时间才能真正取消并离开会话。为了证明这一点,请取消会话并在之后定期检索其任务。它们会慢慢下降到零。

您需要做的是使用新标识符创建一个新会话。 使用相同的标识符将导致旧会话被使用并在为其安排新任务时崩溃!

对于那些寻求执行后台下载的人,请考虑使用 UUID().uuidString 作为标识符的一部分并将 id 存储在设备上的某处(想到用户默认值),并在每次调用后生成一个新的 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()

【讨论】:

以上是关于会话失效后如何重新验证会话 Alamofire?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 关闭证书验证?

MVC 4:如何在 IIS 重启后保持会话和 cookie 仍然有效?

如何使用 DVR 会话初始化 Alamofire 管理器?

为啥不建议在 Alamofire 中修改授权标头的会话配置?

Firebase - 一小时后丢失身份验证会话

如何使用 Alamofire 和会话管理器附加 MultipartFormData 以及其他帖子参数? [复制]