RestKit сопоставление массива строки и значения keyPath в том же объекте

Я часами ищу ответ, понятия не имею, что делать.

У меня есть JSON, который мне нужно сопоставить, который имеет массив строк без keyPath, но также имеет атрибут, который необходимо сопоставить, который имеет keyPath. Я использовал RestKit 0.21.0 и имел ту же ошибку при обновлении до RestKit 0.22.0.

JSON:

{
  "content": {
    "site": "www.inf.ufsc.br/~fcdocil",
    "modulos": [
      "noticias",
      "fotos",
      "conteudo"
    ]
  }
}

RKResponseDescriptor:

RKEntityMapping *moduleMapping = [RKEntityMapping mappingForEntityForName:@"Module" inManagedObjectStore:store];
    [moduleMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"type"]];
    [moduleMapping addAttributeMappingsFromDictionary:@{@"@parent.site" : @"site"}];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:moduleMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"content.modulos" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

Когда я запускаю это, он успешно отображает массив в 3 разных элементах, как вы можете видеть здесь:

SUCCESS (
    "<Module: 0x8e54280> (entity: Module; id: 0x8cd31f0 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p4> ; data: {\n    site = nil;\n    type = noticias;\n})",
    "<Module: 0x8e666b0> (entity: Module; id: 0x8cd3180 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p2> ; data: {\n    site = nil;\n    type = fotos;\n})",
    "<Module: 0x8e66a60> (entity: Module; id: 0x8cd3170 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p3> ; data: {\n    site = nil;\n    type = conteudo;\n})"
)

Но он не сделал @parent.site, чего я желаю:

SUCCESS (
    "<Module: 0x8e54280> (entity: Module; id: 0x8cd31f0 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p4> ; data: {\n    site = www.inf.ufsc.br/~fcdocil;\n    type = noticias;\n})",
    "<Module: 0x8e666b0> (entity: Module; id: 0x8cd3180 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p2> ; data: {\n    site = www.inf.ufsc.br/~fcdocil;\n    type = fotos;\n})",
    "<Module: 0x8e66a60> (entity: Module; id: 0x8cd3170 <x-coredata://B31664A2-091E-43B8-9B36-EB7AF6C27292/Module/p3> ; data: {\n    site = www.inf.ufsc.br/~fcdocil;\n    type = conteudo;\n})"
)

Я использую CoreData для сохранения данных, и мой ManagedObject такой,

Module.h

@interface Module : NSManagedObject

@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * site;

@end

Module.m

@implementation Module

@dynamic type;
@dynamic site;

@end

Я действительно не знаю, что я делаю неправильно, поэтому любые предложения будут оценены. Спасибо


person Felipe Docil    schedule 25.11.2013    source источник


Ответы (1)


Когда вы устанавливаете путь ключа дескриптора ответа к @"content.modulos", вы просите RestKit выбросить всю вышестоящую и родственную информацию из JSON (во время процесса сопоставления). Итак, @parent информации не существует.

Вы не можете действительно отобразить вашу текущую желаемую структуру. RestKit ожидает, что вы сопоставите site с одним объектом, а затем сопоставите modulos с другим объектом (с использованием вложенного сопоставления, связанного с RKRelationshipMapping) и используйте связь для их соединения. Таким образом вы можете использовать @parent, но вам больше не понадобится. Дескриптор единственного ответа будет использовать сопоставление site и путь ключа @"content".

person Wain    schedule 25.11.2013
comment
Спасибо, я не хотел использовать отношения, потому что эти данные собираются заполнить TableView, поэтому намного проще получить таблицу Module, а затем использовать предикат для выбора site, который вы хотите. Что ж, но если это дизайн RestKit, мне нужно только следовать. И я не буду выбирать ваш ответ, потому что это было не то, что я искал, хотя он был полезен. Еще раз спасибо. - person Felipe Docil; 25.11.2013
comment
Предикаты могут перемещаться по отношениям, так что вы можете делать свою таблицу и фильтровать. Единственное, что следует иметь в виду, это то, что если вы используете FRC, он не будет обновляться для изменений в содержании отношений. - person Wain; 25.11.2013