【问题标题】:How to close an NSURLSession dataTaskWithRequest如何关闭 NSURLSession dataTaskWithRequest
【发布时间】:2019-05-20 20:58:19
【问题描述】:

我正在运行一个不断从服务器查找数据的应用程序。我正在使用 datataskwithrequest 和 completionhandler 创建一个 nsurlsession。我每三十秒重复一次请求。问题是,经过一段时间后,我得到一个 dnssd_clientstub Connect to server: socket failed 24 to many open files。我想我需要在收到有或没有数据的响应后关闭每个会话,或者一遍又一遍地使用同一个会话。我正在寻找任何建议。

【问题讨论】:

    标签: objective-c nsurlsession


    【解决方案1】:

    我建议您不要不断地重新实例化新的 NSURLSession 对象,而是确保重复使用现有实例。

    如果您绝对需要单独的 NSURLSession 实例,您可以使用 finishTasksAndInvalidate 清理之前的实例。我认为最好使用单个实例,但如果您绝对需要单独的实例,这是清理旧实例的一种方法。


    顺便说一句,您可能会考虑另一种网络模式,即基于套接字的解决方案。然后,与其像 Bart Simpson 那样在汽车后座反复询问“我们到了吗?”,您可以让您的服务器告诉您的客户什么时候需要通知客户。这是一种完全不同的方法,但比每 30 秒轮询一次要好得多。如果您不想推出自己的基于套接字的解决方案,FirebaseRealm 等框架可以提供这种实时交互。

    或者,如果您真的想使用自己的服务器并且您还没有准备好跳转到套接字(或者如果您无法控制服务器的 RESTful 接口),请考虑让您的服务器启动推送通知当有客户的数据时。它不那么可靠,但仍然比每 30 秒轮询一次要好。推送通知还有一个优点,即服务器可以告诉您的客户端何时有数据要检索,即使应用程序没有运行,用户也可以选择是否启动应用程序(或者应用程序可以在后台获取数据这样当用户启动它时,数据就已经存在了)。

    【讨论】:

    • Rob 你能指点我一个如何重用 NSUrlSession 实例的例子
    • 好吧,[NSURLSession sharedSession] 一个。或者您可能有一些管理器/服务对象用于发起请求(例如,stackoverflow.com/a/32676536/1271826;这是后台会话所必需的基于委托的方法,但总体思路也适用于 defaultSessionConfiguration 配置)。跨度>
    • Rob 让我为您提供更多信息。我现在设置的方式是创建一个 NSURLSession 并在该会话中创建四个任务。每个任务对返回不同数据的同一个 Web 服务执行不同的 url 请求。我正在为四个任务使用 dataTaskWithRequest:req completionHandler:。我有一个finishtasksandinvalidate 在resume 之前的最后一个任务结束时。
    • 那么,下次你创建另一个NSURLSession 和四个请求?为什么每次都是另一个NSURLSession?为什么不使用相同的NSURLSession
    • 而且,顺便说一句,您是在前一个请求的所有四个请求完成后 30 秒开始下一批请求,还是只有一个 30 秒的重复计时器?您希望在重复该过程之前让先前的完成。它们可能需要 30 多秒才能完成,如果您不让它们在前一个完成之前完成,您很容易遇到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多