传统上,我一直使用NSOperation子类创建和管理自己的NSURLConnection的模式。视图控制器实例化NSOperation子类,并在完成之前不打扰控制器。当它完成检索数据时,它将执行视图控制器提供的完成块。
我现在正尝试用NSURLSession实现相同的模式。我希望能够封装在单个对象中进行网络请求所需的url和参数。我是使用NSURLSession子类还是NSURLSessionTask子类来实现这一点?
我喜欢根据参与者设计模式为每个网络操作创建单独的类。
发布于 2014-01-15 21:46:01
您可以使用相同的模式,将NSURLConnection替换为NSURLSessionTask子类(例如NSURLSessionDataTask)。
正如@CouchDeveloper在注释中所建议的那样,另一种选择是使用异步语义(cancel、resume等)将NSURLSessionTask包装在非NSOperation对象中。这个包装器对象所做的仅仅是编码和解码参数,将大部分操作委托给包装的任务。
在这两种情况下,要实例化NSURLSessionTask,您都需要一个NSURLSession。(NSURLSession是NSURLSessionTask工厂。)如果您的所有操作都使用相同的配置 (cookies、代理、缓存等),则只需使用共享会话(+[NSURLSession sharedSession])即可。如果它们需要不同的配置,您必须给它们一个NSURLSession或足够的信息来创建它们自己的配置。
发布于 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。
发布于 2014-06-11 01:27:38
我希望能够封装在单个对象中进行网络请求所需的url和参数。我是使用NSURLSession子类还是NSURLSessionTask子类来实现这一点?
您所描述的是NSURLRequest。NSURLSession和NSURLConnection都采用NSURLRequest来执行网络连接( NSURLRequest就是要执行的)。您需要的似乎是一组工厂方法,用于生成不同的、专门的NSURLRequests。例如,一个描述“获取我的邮件”请求的请求。您可以通过在NSURLRequest本身上创建一个类别来轻松地做到这一点。示例:
@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有其他机制来定制类行为,从工厂方法(像上面这样的“方便方法”)到委托(其中一个对象负责另一个对象的行为)。
https://stackoverflow.com/questions/21148006
复制相似问题