ios - NSUrlSession 重置(completionHandler:)
问题描述
当我们在 UrlSession 上执行 reset(completionHandler:) 时,会话中存在的当前任务会发生什么。此外,如果它取消当前任务,那么我们如何在调用 reset(completionHandler:) 之前等待当前任务完成
解决方案
当您调用 URLSession 时reset
,所有正在运行的任务都会继续运行。
一个常见的用例reset
是,您想要清除与登录用户关联的所有数据,例如“退出”功能。在调用之前恢复的请求reset
可能会使用旧的URL 凭据存储,但它们可能会在响应完成时使用新的URL 缓存。这当然不是你想要的。
因此,实现此目的的更强大的方法如下:
- 防止启动新任务(避免任何数据竞争问题)
- 清除与旧“会话环境”相关的所有数据——可能包括访问令牌和用户数据等。
- 取消所有正在运行的任务(异步 - 触发并忘记),然后
- 调用
reset
,然后 - 启用恢复任务。
新任务将使用新的“会话环境”,之前恢复的任务将完成并出现取消错误。
第一个要点可能是最复杂的,因为您需要确保您甚至不使用与旧会话环境关联的数据创建请求。这可以使用网络层来解决,该网络层具有将传入的高级“API 请求”排队的功能,并且可以暂停和恢复该队列。
推荐阅读
- reactjs - 尝试在 docker 容器中运行 react 应用程序时出错
- azure - 在“数据工厂”模式下启用发布
- java - 具有许多参数的方法 (Sonarlint)
- reactjs - 使用 React Native WebView 获取“来源:错误”
- api - 进行集成测试时如何绕过所有服务调用的 [Authorize(Roles = "Admin")] 标签?
- c++ - 我如何知道 valgrind 错误是由我的代码还是由我的代码所依赖的某个库引起的?
- python - 我有 2 行,1 行用于时间戳,1 行用于状态“200 ok”和“未找到”,如何获得超过 1% 的错误
- ansible - 角色复制和执行仅适用于第一个角色输入
- r - R dplyr 使用包含列索引的计算转换列数据
- sql - SQLite:在另一个子查询中使用子查询结果