用NSURLSession替换NSURLConnection

use*_*688 9 ios nsurlsession

我一直在设计NetworkCommunication.我有一个设计,其中NSOperation子类创建和管理自己的NSURLConnection.该NSOperation子类由一个实例NetworkManger,它增加了类NSOperationQueue.请求完成后,委托人(例如:ViewController将被调用).这是流程:

Network Manger实例化子NSOperation类(它封装了URL,参数等)并将其添加到NSOperationQueue它维护的中.NSOperation子类实例化NSURLConnection(执行asynchronous请求并检索数据) NSURLConnection将数据转储到NSOperation-subclass NSOperation-subclass执行委托(视图控制器)提供的完成块.我现在正试图实现相同的模式NSURLSession.我希望能够封装在单个对象中发出网络请求所需的url和参数.

如果我使用相同的模式,是否可以NSURLSession.我检查了AFNetworking课程.但是,他们没有将NSOperation子类化NSURLSession.此外,会话对象应该去哪里.它会成为NSOperation课程的一部分吗?

有人可以就此提出一些专家意见.我应该可以取消请求,上传(POST/PUT),下载数据.Network Manager类将成为任何网络请求的单一联系点.

Rob*_*Rob 17

更新:

NSURLConnection不推荐使用有效的Mac OS 10.11和iOS 9.所以,此时NSURLSession应该用来代替NSURLConnection.正如NSURLConnection.h标题所示:

推荐使用:NSURLConnection类不应该再被使用.NSURLSession是替代品NSURLConnection.

我原来的答案如下.


答案取决于您是否需要各种NSURLSession委托方法的丰富性.如果您在使用完毕块引渡(即没有进展的回调,没有流等)就好了,从转换NSURLConnectionNSURLSession是相当琐碎.只需将您的NSURLSession实例放在您的NetworkManager类中,然后将基于委托的NSURLSessionTask实例包装在并发NSOperation子类中即可.只需采用标准的异步/并发NSOperation子类模式.

如果你正在使用基于代表的演绎NSURLSession,那就是一个完全不同的鱼.主要的麻烦是NSURLSessionTask在会话上调用各种委托方法delegate而不是任务委托对象.乍一看,这可能听起来像是一个微不足道的问题,但是如果您的操作实例具有唯一的完成/进度块,那么您就会遇到如何让会话对象将这些委托方法回调映射到个人的麻烦原始请求操作实例.

要解决这个问题,您必须维护任务标识符到NSOperation子类对象的映射.然后,您可以NSURLSessionTask在相应的NSOperation子类中实现这些(包括任务,下载任务和上载任务)委托方法.所述NSURLSession网络管理器类可接着,通过接收时NSURLSessionTask代表呼叫,则使用任务标识符来识别适当的NSOperation实例,然后调用适当的委托方法那里.

最后,如果您打算处理后台NSURLSession实例,生活会变得更加困难(因为即使在您的应用程序终止并且其所有对象都已被丢弃后,后台任务仍将继续).背景会话根本不适合NSOperation基于方法的方法.

最重要的是,如果你只需要完成块NSURLSession方法,这是微不足道的,但如果你需要基于委托的再现,这有点麻烦.

  • 例如,假设您有两个网络请求,包含在自己的操作中,一个是下载图像,另一个是请求JSON.当`NSURLSession`的委托调用任务委托方法时,它如何知道该调用的操作(图像或JSON)?有两种逻辑方法:一种是为每个操作建立一个单独的会话(这似乎在架构上不优雅).另一种方法是让公共会话实例维护哪个任务标识符属于哪个操作的映射. (3认同)