gpt4 book ai didi

ios - 基于 NSURLSession 的网络模式

转载 作者:可可西里 更新时间:2023-11-01 03:38:11 24 4
gpt4 key购买 nike

传统上,我一直在使用 NSOperation 子类创建和管理它们自己的 NSURLConnection 的模式。 NSOperation 子类由 View Controller 实例化,并且在完成之前不会打扰 Controller 来完成它的工作。当它完成检索数据时,它会执行 View Controller 提供的完成 block 。

  1. ViewController 实例化 NSOperation 子类(封装 URL、参数等)
  2. NSOperation 子类实例化 NSURLConnection(执行同步请求和检索数据)
  3. NSURLConnection 将数据转储到 NSOperation 子类
  4. NSOperation 子类执行 View Controller 提供的完成 block 。

我正在尝试使用 NSURLSession 实现相同的模式。我希望能够将发出网络请求所需的 url 和参数封装在单个对象中。我是使用 NSURLSession 子类还是 NSURLSessionTask 子类来实现这一点?

我喜欢根据 actor 设计模式为每个网络操作创建单独的类。

最佳答案

NSURLSessionTask 类(及其子类)看起来有点像操作,但它们不是。因此,您可以在转换到 NSURLSession 时从代码中删除操作,但如果这样做,您将失去某些 NSOperation 功能(依赖关系、控制并发度等。 ).我不确定您为什么要在转换到 NSURLSession 时从代码中删除操作。就我个人而言,我以前在操作中包装 NSURLConnection 的任何地方,现在我用操作包装 NSURLSessionTask

顺便说一句,NSURLSession 的一个重大烦恼是 task 委托(delegate)是在 session 对象上设置的。我们可以猜测 Apple 这样做的原因,但它具有各种不幸的含义。显然,您可以通过使用基于 block 的工厂方法来创建您的任务来解决这个问题,但是如果您碰巧需要它,您就会失去委托(delegate) API 的丰富性。

这意味着如果使用基于 block 的任务工厂方法,将任务包装在并发的 NSOperation 子类中是相当明显的。但是,如果使用基于委托(delegate)的任务,如果你想为任务定制处理程序,你必须通过维护任务标识符和适当的完成 block (我个人放在 session 管理器对象中)之间的映射来经历一些愚蠢的事情我用来包装 NSURLSession)。 (仅供引用,我相信在即将到来的 AFNetworking 更新中也有望实现这样的实现。请参阅 AFNetworking github 站点上关于 Issue 1504 的讨论的后半部分。)

无论如何,其他人已经回答了如何用非基于操作的 NSURLSession 代码替换基于操作的 NSURLConnection 代码的问题,但我个人建议保留与操作。


顺便说一句,我已经在github上上传了一个基于操作的NSURLSession实现的示例实现:https://github.com/robertmryan/NetworkManager

这并不是一个完整的解决方案,而是说明了如何使用 NSOperation 子类实现基于委托(delegate)的 NSURLSession 的想法。

关于ios - 基于 NSURLSession 的网络模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com