【发布时间】:2013-07-10 02:55:58
【问题描述】:
我的 JSON 响应如下所示:
{
"enabled": false,
"number_of_articles": 20,
"new_users": [
{
"id": "5001",
"name": "Jimmy Valner"
},
],
"articles" : [
{
"id" : 33122,
"title" : "Something",
"authors": [
{
"id": "511",
"name": "Somebody"
},
{
"id": "51",
"name": "Somebody else"
}
}]
}
据我所知,这并不是一个真正正确的 RESTful 响应。但我必须以某种方式将其映射到两个不同的实体(用户和文章)。 A 已经有文章部分的工作代码。它将文章和文章映射为关系。 我是这样做的:
RKMapping *mapping = [MappingProvider articlesMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
responseDescriptorWithMapping:mapping
pathPattern:@"/articles/:userId/latest"
keyPath:@"articles"
statusCodes:statusCodeSet];
NSURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:nil
method:RKRequestMethodGET
path:[NSString stringWithFormat:@"/articles/%@/latest", [[CredentialStore sharedInstance] userId]]
parameters:nil];
RKManagedObjectStore *store = [[DataModel sharedDataModel] objectStore];
RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request
responseDescriptors:@[responseDescriptor]];
operation.managedObjectCache = store.managedObjectCache;
operation.managedObjectContext = store.mainQueueManagedObjectContext;
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(@"%@", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"ERROR: %@", error);
NSLog(@"Response: %@", operation.HTTPRequestOperation.responseString);
}];
[operation start];
这是按预期工作的。我在+ (RKMapping *)articlesMapping 方法中提供了映射说明。甚至 JSON 响应的作者部分也被正确映射。
现在我想将new_users 数组映射到不同的实体(显然是用户)。如何通过不向服务器调用另一个请求来做到这一点?我在创建另一个RKManagedObjectRequestOperation *operation 方面取得了一些成功,但这当然会触发另一个我想避免的对服务器的网络请求。
我应该在RKObjectManager 中寻找解决方案,还是应该以某种方式更改 keyPath 以从根级别开始并在 + (RKMapping *) 方法中为不同实体进行映射(可能不是)?
还有一个问题 .. 我如何从这个 JSON 访问 enabled、number_of_articles 属性?同样,我不是在处理一个结构良好的 Restful 响应,但我必须以某种方式处理它。我只想以某种方式访问这些属性...不需要映射到实体。
【问题讨论】: