Дескриптор ответа для метаданных RestKit JSON

У меня есть ответ JSON, который возвращает мне список объектов, а также значение метки времени как «Метаданные». Ответ выглядит примерно так -

{
  "access_time": 1416467865510,
  "profiles" : [
    {
        "user_id": "bbb91ae431b",
        "email": "[email protected]",
        "first_name": "Bob",
        "last_name": "Burroughs",
        "primary_phone": "16507001212"
    },
    {
        "user_id": "ddd8d8d8d8d",
        "email": "[email protected]",
        "first_name": "Don",
        "last_name": "Darko",
        "primary_phone": "14154001212"
    }
  ]
}

Мой код дескриптора RestKit выглядит примерно так. И это работает хорошо, я получаю все объекты.

RKEntityMapping *contactMapping = [RKEntityMapping mappingForEntityForName:@"Contact" inManagedObjectStore: managedObjectStore];
[contactMapping addAttributeMappingsFromDictionary:@{
                                                   @"user_id" : @"userId",
                                                   @"email" : @"email",
                                                   @"first_name" : @"firstName",
                                                   @"last_name" : @"lastName",
                                                   @"primary_phone" : @"primaryPhone"
                                                   }];
contactMapping.identificationAttributes = @[@"userId"];
RKResponseDescriptor *contactResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:contactMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"profiles" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

Вышеупомянутая вещь хорошо работает для меня. Однако я также хотел иметь доступ к полю access_time выше. Как мне получить к этому доступ? Я думаю сохранить это значение в NSUserDefaults для последующего использования, так как это не поле, которое является частью объекта User/Contact. Как мне это сделать?


person Rahul Jiresal    schedule 20.11.2014    source источник
comment
Вы пытались добавить второй дескриптор ответа?   -  person Wain    schedule 21.11.2014


Ответы (2)


попробуй это:

[contactMapping addAttributeMappingsFromDictionary:@{
                                               @"user_id" : @"userId",
                                               @"email" : @"email",
                                               @"first_name" : @"firstName",
                                               @"last_name" : @"lastName",
                                               @"primary_phone" : @"primaryPhone",
                                               @"@parent.access_time" : @"accessTime",
                                               }];

Вы можете прочитать больше здесь

person Mateusz    schedule 20.11.2014
comment
Проблема в том, что accessTime не является свойством Contact. Кроме того, этот подход будет делать это для каждого объекта Contact. Мне это нужно только один раз. - person Rahul Jiresal; 20.11.2014
comment
хорошо, я неправильно понял ваш вопрос. Таким образом, NSUserDefaults является одним из вариантов. Попробуйте это: stackoverflow.com/questions/14247540 / - person Mateusz; 20.11.2014

Вы можете создать связь между родительским объектом JSON (который содержит «access_time») и дочерними объектами «профили» с помощью RKRelationshipMapping.

Затем вместо того, чтобы ваш дескриптор ответа напрямую обращался к keyPath:@"profiles", вы можете установить для него значение keyPath:nil и получить доступ ко всему объекту JSON, включая время доступа и связанные профили.

Вам также необходимо убедиться, что у вас есть соответствующие Entity и Relationships (в модели данных) для родительского объекта JSON (вы можете называть его как хотите). Затем вернитесь в файл с сопоставлениями RestKit и добавьте отношения к родительскому объекту сопоставления с помощью addPropertyMappingsFromArray:.

Затем, как только запрос будет возвращен, вы можете выполнить итерацию по связанным объектам профиля родительского JSON (при условии, что у вас есть XCode для создания связанных подклассов NSManagedObject) с помощью простого:

// allObjects returns an NSArray representation of the NSSet
NSArray *profiles = [[parentObject valueForKeyPath:@"profiles"] allObjects];

Надеюсь, это поможет.

person Asciant    schedule 24.11.2014
comment
Для меня это не похоже на чистое решение. Это будет создавать новый объект ParentJSONObject каждый раз, когда я делаю вызов. И тогда таких объектов со временем будет несколько. Мне нужно использовать время доступа с течением времени, и мне нужно, чтобы сохраненное время доступа перезаписывалось новым каждый раз, когда я его получаю, вместо того, чтобы иметь много из них. - person Rahul Jiresal; 24.11.2014
comment
Нет проблем, если у вас есть возможность изменить вывод JSON в вашем API, вы можете жестко закодировать статический атрибут идентификации, поэтому RK создает только один родительский объект. В любом случае, удачи в вашем вопросе! - person Asciant; 24.11.2014