NSE*_*rer 6 objective-c ios nsurlsession
我一直在使用NSOperation子类创建和管理自己的NSURLConnection的模式.NSOperation子类由视图控制器实例化,它将完成其工作,而不会打扰控制器,直到它完成.当它完成检索数据时,它执行视图控制器提供的完成块.
我正在尝试使用NSURLSession实现相同的模式.我希望能够封装在单个对象中发出网络请求所需的url和参数.我是使用NSURLSession子类还是NSURLSessionTask子类实现此目的的?
我喜欢基于actor设计模式为每个网络操作创建单独的类.
Rob*_*Rob 11
将NSURLSessionTask类(和它的子类),看起来有点像操作,但他们没有.因此,您可以在转换时从代码中删除操作NSURLSession,但如果这样做,您将失去某些NSOperation功能(依赖性,控制并发度等).我不知道你为什么要在转换到代码时从代码中删除操作NSURLSession.就个人而言,我曾经NSURLConnection在一个操作中包装一个地方,我现在NSURLSessionTask用一个操作包装一个.
顺便说一下,其中一个重要的烦恼NSURLSession是,任务委托被设置在会话对象上.我们可以猜测苹果为什么这样做,但它有各种不幸的含义.显然,您可以通过使用基于块的工厂方法来创建任务来解决这个问题,但如果您碰巧需要,则会失去委托API的丰富性.
这意味着如果使用基于块的任务工厂方法,将任务包装在并发NSOperation子类中是相当明显的.但是,如果使用基于委托的任务,如果你想要任务的自定义处理程序,你必须经历一些愚蠢的事情,维护任务标识符和适当的完成块之间的映射(我个人放在会话管理器对象中)我曾经包装过NSURLSession).(仅供参考,我相信在即将发布的AFNetworking更新中也会出现这样的实现.请参阅AFNetworking github网站上有关问题1504的讨论的后半部分.)
无论如何,其他人已经回答了如何NSURLConnection用非基于操作的代码替换基于操作的NSURLSession代码的问题,但我个人建议继续操作.
顺便说一下,我NSURLSession在github 上传了一个基于操作的实现的示例实现:https://github.com/robertmryan/NetworkManager
这并非是一个完整的解决方案,但说明了一个如何实现基于代理的想法NSURLSession与NSOperation子类.
您可以使用相同的模式,替换NSURLConnection为NSURLSessionTask子类(例如NSURLSessionDataTask)。
正如 @CouchDeveloper 在评论中建议的那样,另一种方法是使用异步语义(取消、恢复等)包装NSURLSessionTask在非对象中。NSOperation这个包装器对象除了对参数进行编码和解码之外,几乎没有什么作用,将大多数操作委托给包装的任务。
无论哪种情况,要实例化NSURLSessionTask,您都需要一个NSURLSession. (NSURLSession是NSURLSessionTask工厂。)如果您的所有操作都使用相同的配置(cookie、代理、缓存等),您可以简单地使用共享会话 ( +[NSURLSession sharedSession])。如果他们需要不同的配置,您必须向他们提供一个NSURLSession或足够的信息来创建自己的配置。
| 归档时间: |
|
| 查看次数: |
3991 次 |
| 最近记录: |