2014-11-20 3 views
1

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

{ 
    "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. Как мне это сделать?

+0

Вы пытались добавить второй дескриптор ответа? – Wain

ответ

2

попробовать это:

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

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

+0

Проблема с этим: 'accessTime' не является свойством' Contact'. Кроме того, этот подход сделает это для каждого объекта Contact. Мне нужно это только один раз. –

+0

Хорошо, я неправильно понял ваш вопрос. Таким образом, NSUserDefaults является одним из вариантов. Попробуйте это: http://stackoverflow.com/questions/14247540/access-response-data-in-success-callback – Mateusz

0

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

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

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

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

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

Надеется, что это помогает.

+0

Для меня это не похоже на чистое решение. Это создаст новый объект ParentJSONObject при каждом вызове. И тогда с течением времени будет много таких объектов. Мне нужно использовать «access_time» с течением времени, и мне нужно, чтобы время хранения было перезаписано новым при каждом его получении, вместо того чтобы иметь много из них. –

+0

Нет проблем, если у вас есть возможность изменить выход JSON в вашем API, вы можете жестко закодировать статический атрибут [идентификатор] (http://restkit.org/api/latest/Classes/RKEntityMapping.html#//api/ name/identAttributes), поэтому RK создает только один родительский объект. В любом случае, удачи в вашем вопросе! – Asciant

Смежные вопросы