NSURLSession 的最佳实践是什么?

问题描述

订阅我的应用:

  1. 大部分场景使用 AFNetworking,一小部分场景使用 NSURLSession.sharedSession 或创建一个新的 NSURLSession。

  2. 使用一个 URLProtocol 实例来处理几乎所有的请求,并且在 -startLoading 函数的末尾,只使用一个 NSURLSession 来恢复所有任务。

我的问题是:

  1. 我知道 URLSession 实例会导致内存增长,它会持续大约 10 分钟,那么应用程序容纳 URLSession 实例的最大限制是多少?

  2. NSURLSession 的最佳实践是什么?是否建议整个应用程序只使用一个 URLSession 实例?还是固定域使用固定NSURLSession(A域使用A会话,B域使用B会话)?

  3. 我是否应该创建多个 URLProtocol 实例来处理不同的域请求

谢谢!

解决方法

您希望尽可能少地使用 URLSession。通常,这只是一个,而且您也不太可能在应用的生命周期内使此会话无效并创建一个新会话。

尽可能少的原因是 URLSession 专门设计用于处理多个网络请求 - 并行或顺序执行它们 - 并且可以优化在此会话中执行的所有请求以使用更少的内存,功耗更低,执行时间更快。

另一方面,优化在不同 URLSession 中执行的请求的选项要少得多。特别是对于在不同 URLSession 中运行的请求,使用 HTTP/2 无法获得性能提升。

但是,可能存在您创建多个的要求或情况。例如,您使用创建自己的 URLSession 的第三方图像加载库。或者您需要不同的 URLSession 配置,例如蜂窝使用、cookie 策略或缓存策略等,这些配置不能共享。

或者,例如,您想将某个 URLSession 及其 URLCache 和凭据缓存绑定到某个 经过身份验证的 用户。当您的应用程序中有一些“注销”功能时,您可以使会话无效,清除凭证存储和 URLCache。同时,您有另一个用于“公共”API 的 URLSession 和用于图像加载的另一个 URLSession,它们不受“注销”的影响 - 以及应保留缓存响应的位置。

为每个请求创建一个 URLSession 是一个严重的禁忌,然后在请求完成时让它挂起并在下一个请求中创建另一个 URLSession。你不能做得比这更糟。

另见

Apple Developer Forum

WWDC: NSURLSession: New Features and Best Practices

WWDC: Networking with NSURLSession

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...