首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于NSURLSession的网络模式

基于NSURLSession的网络模式
EN

Stack Overflow用户
提问于 2014-01-15 20:56:03
回答 4查看 4.1K关注 0票数 6

传统上,我一直使用NSOperation子类创建和管理自己的NSURLConnection的模式。视图控制器实例化NSOperation子类,并在完成之前不打扰控制器。当它完成检索数据时,它将执行视图控制器提供的完成块。

  1. ViewController实例化NSOperation子类(封装NSOperation、参数等)
  2. NSOperation子类实例化NSURLConnection (执行同步请求并检索数据)
  3. NSURLConnection将数据转储到NSOperation子类
  4. NSOperation-子类执行视图控制器提供的完成块。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-15 21:46:01

您可以使用相同的模式,将NSURLConnection替换为NSURLSessionTask子类(例如NSURLSessionDataTask)。

正如@CouchDeveloper在注释中所建议的那样,另一种选择是使用异步语义(cancel、resume等)将NSURLSessionTask包装在非NSOperation对象中。这个包装器对象所做的仅仅是编码和解码参数,将大部分操作委托给包装的任务。

在这两种情况下,要实例化NSURLSessionTask,您都需要一个NSURLSession。(NSURLSessionNSURLSessionTask工厂。)如果您的所有操作都使用相同的配置 (cookies、代理、缓存等),则只需使用共享会话(+[NSURLSession sharedSession])即可。如果它们需要不同的配置,您必须给它们一个NSURLSession或足够的信息来创建它们自己的配置。

票数 3
EN

Stack Overflow用户

发布于 2014-02-05 16:55:03

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

不过,NSURLSession的一个重要问题是,任务委托是在会话对象上设置的。我们可以猜测为什么苹果会这么做,但它有各种不幸的影响。显然,您可以通过使用基于块的工厂方法来创建任务来解决这个问题,但是如果您恰好需要,那么您就失去了委托API的丰富性。

这意味着,如果使用基于块的任务工厂方法,那么将任务包装在并发NSOperation子类中是相当明显的。但是,如果使用基于委托的任务,如果您想要为这些任务定制处理程序,则必须在任务标识符和适当的完成块之间保持映射(我个人将其放入用于包装NSURLSession的会话管理器对象中)。(FYI,我相信在即将到来的AFNetworking更新中也会有这样的实现。参见在第1504期 github站点上讨论AFNetworking的后半部分。)

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

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

这并不是一个完整的解决方案,但是说明了如何使用NSURLSession子类实现基于委托的NSOperation

票数 11
EN

Stack Overflow用户

发布于 2014-06-11 01:27:38

我希望能够封装在单个对象中进行网络请求所需的url和参数。我是使用NSURLSession子类还是NSURLSessionTask子类来实现这一点?

您所描述的是NSURLRequestNSURLSessionNSURLConnection都采用NSURLRequest来执行网络连接( NSURLRequest就是要执行的)。您需要的似乎是一组工厂方法,用于生成不同的、专门的NSURLRequests。例如,一个描述“获取我的邮件”请求的请求。您可以通过在NSURLRequest本身上创建一个类别来轻松地做到这一点。示例:

代码语言:javascript
复制
@implementation NSURLRequest (Mail)

+ (instancetype) mailRequestForUser:(NSString *)user {
    NSURLRequest *result = nil;
    result = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"someServer""]];
    // set user in a header, whatever

    // return immutable copy
    return [result copy];
}

@end

创建与上面类似的东西,以满足您的需求。生成的NSURLRequest随后可用于创建连接。在Cocoa中,这是一个非常典型的定制对象的模式,而不是子类。子类是非常罕见的-相反,Cocoa有其他机制来定制类行为,从工厂方法(像上面这样的“方便方法”)到委托(其中一个对象负责另一个对象的行为)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21148006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档