GET请求使用AFNetworking和保存响应

我正在用AFNetworking做一个简单的GET请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://someapi.com/hello.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

一旦我提出了请求,我希望能够从类中的任何其他方法访问responseObject

我希望能够保存响应对象,所以我可以做一些像在tableview中显示输出。

创build将由JSON表示的对象模型是很常见的。 当你得到回应时,你会parsing数据到模型中。 我们使用的方法是通过完成块将响应返回给请求者。 您不必将JSONparsing为强types的对象,但它确实是长期有益的。 将networking请求操作划分为单独的类(称为服务)也是一个好主意。 这样你可以实例化一个新的服务,并通过完成块得到通知它已经完成。 例如,您的服务请求签名可能如下所示:

 typedef void(^HelloWorldCompletionHandler)(NSString *helloWorld, NSError *error); - (void)requestHelloWorldData:(HelloWorldCompletionHandler)completionHandler; // implementation - (void)requestHelloWorldData:(HelloWorldCompletionHandler)completionHandler { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://someapi.com/hello.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { id JSONResponse = [operation responseObject]; if (operation.error) { completionHandler(nil, error); } else { // parse the response to something id parserResult = [self parseJSONResponse:JSONResponse]; completionHandler(parserResult, nil); } }]; 

这样你就可以知道networking请求何时完成,你可以在你的课堂上设置你想要的属性。 然后你可以调用tableView.reloadData来使用表中的数据。

所有的代码将进入一个服务types的类。 我喜欢按照责任来组织我的服务。 我不知道你做了多less个不同的数据调用,但是我们有几个用于我们的项目。 例如,如果您正在制作天气应用程序,则可以按“当前情况”,“每日预测”和“每小时预测”进行组织。 我会为这些请求中的每一个提供服务。 说我创build了一个CurrentConditionsService。 标题看起来像这样:

 typedef void(^CurrentConditionsCompletionHandler)(CurrentConditions *currentConditions, NSError *error); @interface CurrentConditionsService : NSObject // locationKey is some unique identifier for a city + (instancetype)serviceWithLocationKey:(NSString *)locationKey; - (void)retrieveCurrentConditionsWithCompletionHandler:(CurrentConditionsCompletionHandler)completionHandler; @end 

然后在我的实现文件中,我会提出请求并调用给定的完成处理程序,就像我上面演示的那样。 这种模式可以跟随许多不同的服务,所有的服务都可以从处理请求/响应部分的基类inheritance。 然后你的子类可以重写特定的方法,并根据types适当地处理/parsing数据。

如果您将JSON响应parsing到模型对象的path,所有您的parsing器将需要符合协议。 这种方式在你的超类中,你的parsing器的具体实现是什么并不重要。 你提供了一个具体实现的超类,它只知道如何调用parsing器并返回响应。

一个JSONparsing器协议的例子如下所示:

 @protocol AWDataParser <NSObject> @required - (id)parseFromDictionary:(NSDictionary *)dictionary; - (NSArray *)parseFromArray:(NSArray *)array; @end 

并在您的服务超级类中调用它:

 - (id)parseJSONResponse:(id)JSONResponse error:(NSError **)error { NSAssert(self.expectedJSONResponseClass != nil, @"parseResponse: expectedJSONResponseClass cannot be nil"); NSAssert(self.parser != nil, @"parseResponse: parser cannot be nil"); id parserResult = nil; if (![JSONResponse isKindOfClass:self.expectedJSONResponseClass]) { //handle invalid JSON reponse object if (error) { *error = [NSError errorWithDomain:NetworkServiceErrorDomain code:kNetworkServiceErrorParsingFailure userInfo:@{@"Invalid JSON type": [NSString stringWithFormat:@"expected: %@, is: %@",self.expectedJSONResponseClass, [JSONResponse class]]}]; } } else { if (self.expectedJSONResponseClass == [NSArray class]) { parserResult = [self.parser parseFromArray:JSONResponse]; }else { parserResult = [self.parser parseFromDictionary:JSONResponse]; } if (!parserResult) { if (error) { *error = [NSError errorWithDomain:NetworkServiceErrorDomain code:kNetworkServiceErrorParsingFailure userInfo:nil]; } } } return parserResult; } 

使用这种方法:

 NSURL *COMBINAT = [[NSURL alloc] initWithString:@"http://someapi.com/hello.json"]; dispatch_async(kBgQueue, ^{ NSData* data = [NSData dataWithContentsOfURL: COMBINAT]; [self performSelectorOnMainThread:@selector(savedata:) withObject:data waitUntilDone:YES]; }); 

然后简单地调用:

 - (void)savedata:(NSData *)responseData { NSError* error; NSLog(@"Answer from server %@", responseData); // ... your code to use responseData } 

只需创build一个属性:

 @property(nonatomic, strong) id savedResponseObject; 

并将其设置在请求的成功处理程序中:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://someapi.com/hello.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { self.savedResponseObject = responseObject; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

然后,通过参考,您将能够从class级中的其他地方访问它。

 self.savedResponseObject