我有一个应用程序可以从一堆不同的视图控制器对同一服务器进行一大堆不同的 REST 调用。关于以下方面的最佳做法是什么URLSession
:共享相同的 URLSession 对象?还是只是 URLSessionConfiguration 对象?还是两者都无所谓?
例如,当向端点发出请求时,我应该
URLSession
使用共享实例化一个全新的每个请求URLSessionConfiguration
?为当前活动的应用程序实例实例化
URLSession
一次,并在所有请求中重用它?
我有一个应用程序可以从一堆不同的视图控制器对同一服务器进行一大堆不同的 REST 调用。关于以下方面的最佳做法是什么URLSession
:共享相同的 URLSession 对象?还是只是 URLSessionConfiguration 对象?还是两者都无所谓?
例如,当向端点发出请求时,我应该
URLSession
使用共享实例化一个全新的每个请求URLSessionConfiguration
?
为当前活动的应用程序实例实例化URLSession
一次,并在所有请求中重用它?
创建多个 URLSession 不是最佳实践。Apple 建议尽可能只创建一个:
WWDC2017 网络进展,第 2 部分
“我们已经看到开发人员采用他们的旧 NSURLConnection 代码并将其转换为新的 URLSession 代码,方法是为他们曾经拥有的每个旧 NSURLConnection 机械地制作一个 URLSession。这是非常低效和浪费的。对于几乎所有你想要的应用程序have 只是一个 URLSession,然后它可以拥有任意数量的任务。唯一需要多个 URLSession 的情况是当您拥有一组具有完全不同要求的不同操作时。在这种情况下,您可能会创建两个不同的配置对象并使用这两个配置对象创建两个不同的 URLSession。”
尽管演示本次会议的 Apple 开发人员回答了一个略有不同的问题,但显然他给出的答案对您的问题也有好处。
仅当您需要在该类上使用同时影响多个任务的方法时,长期存在的共享URLSession
对象才有意义。例如,如果您需要调用getTasksWithCompletionHandler(_:)
or finishTasksAndInvalidate()
,会话对象需要存在足够长的时间以涵盖您希望这些方法影响的所有任务。
如果动态创建它们会导致同时拥有多个相同的实例,这也可能是有意义的。
否则,在需要时创建一个URLSession
,然后在不需要时释放它。
无论哪种情况,我都不会URLSessionConfiguration
始终将共享对象保留在内存中。设置一个可以创建的工厂方法,并在需要时调用它URLSession
。