子类AFHTTPRequestOperationManager?

我发现自己在我的代码中使用AFHTTPRequestOperationManager重复了很多代码,所以我正在考虑对它进行子类化,所以我可以将它设置为单例,并将所有代码放在子类中,而不是通过它传播我的项目。 然而在AFNetworking 2.0( http://nshipster.com/afnetworking-2/ )上的NSHipster情节中,它说:

2.0中的主要区别在于,你将直接使用这个类,而不是子类,因为在“序列化”一节中有解释。

由于AFNetworking和NSHipster有相同的作者,我认为这是一个有效的论点。

所以我的问题是,人们为了在一个类中拥有大多数的networking代码,是否需要子类AFHTTPRequestOperationManager ,或者我忽略了使用框架的一些东西?

这就是我解决它的方法。

我创build了一个新的MyDBClient对象,其中AFHTTPRequestOperationManager是一个属性。 MyDBClient是一个单例类。 然后我从我的视图控制器调用我的MyDBClient,并让该设置操作pipe理器,并启动请求。 这样做的好处是,在AFHTTPRequestOperationManager (iOS7之前)和AFHTTPPSessionManager (iOS7)之间切换更容易。

我有一个连接类的对象。 这广播不同的通知任何对象可以通过[NSNotificationCenter defaultCenter]注册。

 -(void) requestData { [[NSNotificationCenter defaultCenter] postNotificationName:kCuriculumDataSourceFetchingStarted object:nil]; [_sessionManager setDataTaskDidReceiveDataBlock:^(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data) { if (dataTask.countOfBytesExpectedToReceive == NSURLSessionTransferSizeUnknown) return; NSUInteger code = [(NSHTTPURLResponse *)dataTask.response statusCode]; if (!(code> 199 && code < 400)) return; long long bytesReceived = [dataTask countOfBytesReceived]; long long bytesTotal = [dataTask countOfBytesExpectedToReceive]; NSDictionary *progress = @{@"bytesReceived": @(bytesReceived), @"bytesTotal": @(bytesTotal)}; [[NSNotificationCenter defaultCenter] postNotificationName:kCuriculumDataSourceProgress object:nil userInfo:progress]; }]; [self.sessionManager GET:@"recipient/" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { [[NSNotificationCenter defaultCenter] postNotificationName:kCuriculumDataSourceFetchingSucceeded object:nil userInfo:@{@"response": responseObject}]; } failure:^(NSURLSessionDataTask *task, NSError *error) { NSUInteger code = [(NSHTTPURLResponse *)task.response statusCode]; NSString *msg; switch (code) { case kCuriculumDataSourceFetchErrorAPIKeyNotFound: msg = @"Api Key not found or revoked"; break; case kCuriculumDataSourceFetchErrorServerDown: msg = @"Server Down"; break; default: msg = [error localizedDescription]; break; } [[NSNotificationCenter defaultCenter] postNotificationName:kCuriculumDataSourceFetchingFailed object:nil userInfo:@{@"error": msg}]; }]; } 

将接收到的数据写入核心数据的对象将注册为kCuriculumDataSourceFetchingSucceeded并可以通过notification.userInfo[@"response"]访问收到的响应。
ViewController将注册为kCuriculumDataSourceFetchingSucceededkCuriculumDataSourceFetchingFailedkCuriculumDataSourceProgress

我只是实例化一个对象,如果是单例,我不必打扰。 因此,我不必将其子类化或做一些关联的对象技巧来获得将返回单例对象的方法。 对从networking获取的数据感兴趣的类将只听通知 – 他们不需要知道获取数据的对象,也不必知道它是否是唯一的types。

连接类对象本身可以注册一个通知,其他类将发布以触发新的数据提取。


视图控制器可以注册通知

 -(void)configure { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchingStarted:) name:kCuriculumDataSourceFetchingStarted object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchingSucceeded:) name:kCuriculumDataSourceFetchingSucceeded object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchingFailed:) name:kCuriculumDataSourceFetchingFailed object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceProgress:) name:kCuriculumDataSourceProgress object:nil]; } 

在这种情况下,视图控制器和networking控制器导入相同的configuration头文件,该文件定义了像kCuriculumDataSourceFetchingSucceeded这样的令牌。 但是,由于这些是简单的NSStrings,所以即使这种依赖性也可以很容易地避免。

处理通知的视图控制器方法的示例

 -(void)dataSourceProgress:(NSNotification *)notification { float bytesReceived = (float)[notification.userInfo[@"bytesReceived"] longLongValue]; float bytesTotal = (float)[notification.userInfo[@"bytesTotal"] longLongValue]; float progress = bytesReceived / bytesTotal; dispatch_async(dispatch_get_main_queue(), ^{ self.progressView.progress = progress; self.imgView.layer.mask = self.progressView.layer; }); }