首页 > 解决方案 > NSUrlSession 重置(completionHandler:)

问题描述

当我们在 UrlSession 上执行 reset(completionHandler:) 时,会话中存在的当前任务会发生什么。此外,如果它取消当前任务,那么我们如何在调用 reset(completionHandler:) 之前等待当前任务完成

标签: iosswiftnsurlsessionnsurlsessionconfiguration

解决方案


当您调用 URLSession 时reset,所有正在运行的任务都会继续运行。

一个常见的用例reset是,您想要清除与登录用户关联的所有数据,例如“退出”功能。在调用之前恢复的请求reset可能会使用的URL 凭据存储,但它们可能会在响应完成时使用的URL 缓存。这当然不是你想要的。

因此,实现此目的的更强大的方法如下:

  • 防止启动新任务(避免任何数据竞争问题)
  • 清除与旧“会话环境”相关的所有数据——可能包括访问令牌和用户数据等。
  • 取消所有正在运行的任务(异步 - 触发并忘记),然后
  • 调用reset,然后
  • 启用恢复任务。

新任务将使用新的“会话环境”,之前恢复的任务将完成并出现取消错误。

第一个要点可能是最复杂的,因为您需要确保您甚至不使用与会话环境关联的数据创建请求。这可以使用网络层来解决,该网络层具有将传入的高级“API 请求”排队的功能,并且可以暂停和恢复该队列。


推荐阅读