我已经开始设计NetworkCommunication
。我有一个设计NSOperation
子类创建并管理自己的NSURLConnection
. The NSOperation
子类由一个实例化NetworkManger
类将其添加到NSOperationQueue
。请求完成后,委托人(例如:ViewController
将被调用)。这是流程:
网络管理器实例化NSOperation
子类(封装 URL、参数等)并将其添加到NSOperationQueue
它坚持认为。
NSOperation子类实例化NSURLConnection
(它执行asynchronous
请求并检索数据)NSURLConnection
将数据转储到 NSOperation 子类
NSOperation 子类执行委托(视图控制器)提供的完成块。
我正在尝试使用相同的模式来实现NSURLSession
现在。我希望能够将发出网络请求所需的 url 和参数封装在单个对象内。
如果我使用相同的模式可以吗?NSURLSession
。我检查了AFNetworking
类。但是,他们没有将 NSOperation 子类化NSURLSession
。而且,会话对象应该去哪里。它是 NSOperation 类的一部分吗?
有人可以就此提供一些专家建议吗?我应该能够取消请求、上传(POST/PUT)、下载数据。网络管理器类将是任何网络请求的单一联系点。
Update:
NSURLConnection
在 Mac OS 10.11 和 iOS 9 中已弃用。因此,此时NSURLSession
应该用来代替NSURLConnection
。作为NSURLConnection.h
标题说:
已弃用: The NSURLConnection
不应再使用类。NSURLSession
是替代品NSURLConnection
.
我原来的答案如下。
答案取决于您是否需要各种丰富的内容NSURLSession
是否委托方法。如果您可以使用完成块再现(即没有进度回调,没有流等),则从NSURLConnection
to NSURLSession
是相当微不足道的。只要把你的NSURLSession
实例在你的NetworkManager
类,然后包装基于委托NSURLSessionTask
并发中的实例NSOperation
子类,你就完成了。只需采用标准的异步/并发NSOperation
子类模式。
如果您使用的是基于委托的再现NSURLSession
,这是完全不同的一锅鱼。主要的麻烦是各种NSURLSessionTask
在会话上调用委托方法delegate
而不是任务委托对象。乍一看,这可能听起来像是一个微不足道的问题,但是例如,如果您的操作实例具有唯一的完成/进度块,那么您就会陷入如何让会话对象将这些委托方法回调映射到各个实例的麻烦。原始请求操作实例。
为了解决这个问题,您必须维护任务标识符到您的任务标识符的映射。NSOperation
子类对象。然后你就可以实现这些NSURLSessionTask
(包括任务、下载任务、上传任务)各自的委托方法NSOperation
子类。这NSURLSession
然后,当网络管理器类收到一个NSURLSessionTask
委托调用,使用任务标识符来识别适当的NSOperation
实例,然后在那里调用适当的委托方法。
最后,如果你打算处理背景NSURLSession
在这种情况下,生活会变得更加困难(因为即使您的应用程序终止并且其所有对象都已被丢弃,后台任务仍将继续)。后台会话根本不适合NSOperation
基于的方法。
最重要的是,如果您只需要完成块,那么这是微不足道的NSURLSession
方法,但如果您需要基于委托的再现,那就有点麻烦了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)