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 автоматически выберет отдельные объекты отношений.

Другие вопросы по тегам