RestKit сопоставляет невложенные отношения с владением объектом

Я пытаюсь связать ответ GET фотографий с их собственным объектом User в Core Data с помощью RestKit (т.е. иметь возможность вызывать user.photos после запроса и автоматически отображать их). Однако я не понимаю, как я могу настроить это так, чтобы делать это автоматически, а не использовать [user setPhotos:...] явно из RKMappingResult

Есть ли способ сделать это автоматически, используя сопоставления и дескрипторы ответов?

Дескриптор маршрута/ответа:

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"
    }
  ]
}

person ZeNewb    schedule 12.12.2013    source источник


Ответы (1)


Не с информацией, которая у вас есть, и с тем, как вы отправляете запрос.

Если бы шаблон пути был @"/api/v1/photos/##USER_ID##", тогда маршрут давал бы достаточно информации для сопоставления внешнего ключа. Если бы возвращенный JSON имел идентификатор пользователя, это дало бы достаточно информации для сопоставления внешнего ключа.

Технически операция содержит всю информацию, необходимую для заполнения отношения, но RestKit (в настоящее время) не пытается это сделать. Вы можете посмотреть на реализацию этого и отправить запрос на извлечение.

person Wain    schedule 12.12.2013
comment
Есть ли что-то, чего вы не знаете о RestKit? - person Martin R; 12.12.2013
comment
@MartinR хорошо, я не читал весь код, поэтому делаю предположения, которые иногда оказываются неверными;) - person Wain; 12.12.2013