URLSession 对象是资源密集型的吗?

Posted

技术标签:

【中文标题】URLSession 对象是资源密集型的吗?【英文标题】:Are URLSession objects resource intensive? 【发布时间】:2019-08-24 02:44:26 【问题描述】:

为每个网络请求创建一个新的 URLSession 会占用大量资源吗?

一些背景:

我正在开发一个用于发出网络请求的库。我正在尝试添加一项功能,该功能允许将结果下载到也报告其进度的文件中。为此,我将不得不成为会议的代表。

这没什么大不了的,除非公共接口允许自定义用于请求的 URLSession。我不想覆盖开发人员想要对其自己的委托进行的任何自定义。

现在,我认为这样做的方法是偷偷复制他们认为正在使用的会话(是的,我要做的不仅仅是复制对象本身),然后是我的内部委托会调用原始公共会话的方法。如果他们在请求期间尝试操纵会话,仍然可能会出现混乱/问题,但这似乎是一个小得多的边缘情况。

我现在唯一担心的是,如果发出许多请求,这可能会占用大量资源。有没有人对此有感觉?

【问题讨论】:

【参考方案1】:

是的,它们很密集。这是来自Apple Staff on the developer forums 的引用。

这是一种常见的反模式,我们专门针对 在今年的 WWDC 上发出警告。根据请求创建会话 在 CPU 上效率低下,更重要的是在网络上。 具体来说,它可以防止连接重用,这会从根本上减慢 背靠背的请求。这对 HTTP/2 尤其不利。我们 鼓励人们在一个会话中将所有类似的任务分组,使用 仅当您有不同的任务集时才进行多个会话 不同的要求(如交互式任务与背景 下载任务)。这意味着许多简单的应用程序可以逃脱 使用单个静态分配的会话。

【讨论】:

以上是关于URLSession 对象是资源密集型的吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 URLSession 缓存图像

从图像 url 下载图像方面,URLSession 与 GCD 有啥区别?

Swift 3 URLSession 发送空请求

使用 Swift URLSession 将标头传递给 URL

有没有办法使用 URLSession.shared.dataTask 并行请求多个不同的资源

php资源是通过引用传递的吗?