1

我的 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 响应,但我必须以某种方式处理它。我只想以某种方式访问​​这些属性……不需要映射到实体。

4

1 回答 1

4

RKManagedObjectRequestOperation有方法initWithRequest:responseDescriptors:是有原因的。请特别注意“s”打开responseDescriptors以及您正在传递数组的事实。这意味着您可以配置多个响应描述符,每个具有相同的路径模式但不同的关键路径,RestKit 将在从服务器接收到的响应中处理它们中的每一个。

请注意,当您这样做时,您可能想要更改您的NSLog(@"%@", mappingResult.array);,因为它将包含列表中的所有顶级项目。相反,您可能应该使用NSLog(@"%@", mappingResult.dictionary);

于 2013-07-09T18:55:58.383 回答