AFIncrementalStore: извлечение связанной сущности только с идентификатором
Я использую API обмена сообщениями App.net в своем приложении Mac, которое использует Core Data с AFIncrementalStore. У меня есть сущность " Канал", которая имеет несколько разных способов связи с сущностью " Пользователи". Есть отношение "владелец", которое простое и работает нормально. Но есть также две сущности ACL: читатели и писатели на канале.
ACL - это просто объект значения ключа, который включает в себя массив идентификаторов пользователей, и это отношение, с которым я не уверен, что делать с использованием AFIncrementalStore.
Я вытягиваю сущность Channel и к ней прикреплен объект ACL ("писатели"), который содержит массив идентификаторов пользователей:
"writers": {
"any_user": false,
"immutable": true,
"public": false,
"user_ids": [
"1",
],
"you": true
},
Я настроил свои отношения в Core Data ("writerUsers" с отношением ко многим для пользователей), но мне не удалось выяснить, где настроить это в AFIS.
Я пытался реализовать - (NSDictionary *)representationsForRelationshipsFromRepresentation:(NSDictionary *)representation ofEntity:(NSEntityDescription *)entity fromResponse:(NSHTTPURLResponse *)response
но, похоже, это работает только в том случае, если ответ сервера включает в себя фактическое значение объекта - всю сущность пользователя, а не только идентификатор.
Я также видел упоминание об использовании - (NSURLRequest *)requestWithMethod:(NSString *)method
pathForRelationship:(NSRelationshipDescription *)relationship
forObjectWithID:(NSManagedObjectID *)objectID
withContext:(NSManagedObjectContext *)context
предоставить запрос URL для выборки объекта пользователя... но этот метод никогда не вызывается из моего подкласса AFHTTPClient.
Итак, как я могу научить AFIncrementalStore использовать пользовательский объект, когда у меня есть только идентификатор?
1 ответ
Я смог решить мою проблему. API должен иметь такой формат в json:
"users": [
{"id":1},
{"id":2}
]
Хотя API не предоставляет данные в этом формате, вы можете "подделать" их в подклассе AFRESTClient.
- (NSDictionary *)representationsForRelationshipsFromRepresentation:(NSDictionary *)representation
ofEntity:(NSEntityDescription *)entity
fromResponse:(NSHTTPURLResponse *)response {
NSMutableDictionary *mutableRelationshipRepresentations = [[super representationsForRelationshipsFromRepresentation:representation ofEntity:entity fromResponse:response] mutableCopy];
if ([entity.name isEqualToString:@"writer"]) {
NSArray *user_ids = [representation objectForKey:@"user_ids"];
NSMutableArray *users = [[NSMutableArray alloc] init];
for (NSNumber *id in user_ids) {
[users addObject:@{@"id":id}];
}
}
[mutableRelationshipRepresentations setObject:users forKey:@"users"];
return mutableRelationshipRepresentations;
}
И, конечно же, вам нужно определить "пользователей" как отношение "многие" в модели. Когда в объектах отношений присутствует только идентификатор, AFIncrementalStore автоматически выберет отдельные объекты отношений.