RestKit 将未嵌套关系映射到拥有对象

Posted

技术标签:

【中文标题】RestKit 将未嵌套关系映射到拥有对象【英文标题】:RestKit mapping unnested relationships to owning object 【发布时间】:2013-12-12 14:38:04 【问题描述】:

我正在尝试使用 RestKit 将照片的 GET 响应与它们在 Core Data 中拥有的 User 对象相关联(即能够在请求后调用 user.photos 并自动映射它们)。但是,我不明白如何将其设置为自动执行,而我必须从RKMappingResult 明确使用[user setPhotos:...]

有没有办法使用映射和响应描述符自动完成此操作?

路由/响应描述符:

RKRoute *userPhotos = [RKRoute routeWithRelationshipName:@"photos" objectClass:[User class] pathPattern:@"/api/v1/photos" method:RKRequestMethodGET];
[[[[APIClient objectManager] router] routeSet] addRoute:userPhotos];

RKResponseDescriptor *photosDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:self.photoMapping   
                                                                                      method:RKRequestMethodGET
                                                                                 pathPattern:nil
                                                                                     keyPath:kJsonPhotos
                                                                                  statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[[APICacheStore sharedStore] objectManager] addResponseDescriptorsFromArray:@[photosDescriptor]];

代码:

+ (void)getPhotosForUser:(User *)user success:(void (^)())success failure:(void (^)(NSString *errorMsg))failure 
  NSAssert(user, @"User must not be nil when we attempt to fetch their photos.");
  [[APIClient objectManager] getObjectsAtPathForRelationship:@"photos" ofObject:user parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    [user setPhotos:[NSSet setWithArray:[mappingResult array]]];
    success();
   failure:^(RKObjectRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
    failure(error.localizedDescription);
  ];

原始 JSON:


  "meta": 
    "total": 2,
    "offset": 0,
    "limit": 10
  ,
  "photos": [
    
      "id": "d8e1ca59-9f50-4963-8e7e-0b0c8de4bed6",
      "name": "Mary at the mall",
      "updated_at": "2013-12-11T10:16:41.000Z",
      "completed_at": null,
      "created_at": "2013-12-11T10:16:41.000Z",
      "image": "images/is9912zh/image.jpeg"
    ,
    
      "id": "1c75273a-7675-43a9-9b62-3d4236439ec6",
      "name": "John at the park",
      "updated_at": "2013-12-11T10:16:41.000Z",
      "completed_at": null,
      "created_at": "2013-12-11T10:16:41.000Z",
      "image": "images/aj92j127/image.jpeg"
    
  ]

【问题讨论】:

【参考方案1】:

与您似乎拥有的信息以及您发送请求的方式无关。

如果路径模式是@"/api/v1/photos/##USER_ID##",那么路由将为外键映射提供足够的信息。如果返回的 JSON 包含用户 ID,那么这将为外键映射提供足够的信息。

从技术上讲,该操作具有填充关系所需的所有信息,但 RestKit (当前)不尝试这样做。你可以看看实现这个并提交一个拉取请求。

【讨论】:

关于 RestKit 有什么你不知道的吗? @MartinR 好吧,我还没有阅读所有代码,所以我确实做出了有时结果错误的假设 ;)

以上是关于RestKit 将未嵌套关系映射到拥有对象的主要内容,如果未能解决你的问题,请参考以下文章

RestKit .22:无法成功映射与嵌套 JSON 的关系

RestKit嵌套的一对多关系映射很慢

Restkit:嵌套关系映射

RestKit 对象映射:如何从键值映射到新对象/关系?

Restkit 映射复杂的嵌套数组

RestKit 一对多关系逆映射