2014-02-09 3 views
0

Я пытаюсь отобразить результат API, имеющий динамические вложенные атрибуты. Результат (JSON), у меня есть это:Атрибуты динамического вложения RestKit

{ 
    "url": "https://api.github.com/gists/8901308", 
    "id": "8901308", 
    "html_url": "https://gist.github.com/8901308", 
    "files": { 
     "node-and-npm-in-30-seconds.sh": { 
      "filename": "node-and-npm-in-30-seconds.sh", 
      "type": "application/sh", 
      "language": "Shell", 
      "raw_url": "https://gist.github.com/braincrash/8901308/raw/bae861f7c4ab0c1ffd9962439e770b02f52c5dd7/node-and-npm-in-30-seconds.sh", 
      "size": 352 
     }, 
     "only-git-all-the-way.sh": { 
      "filename": "only-git-all-the-way.sh", 
      "type": "application/sh", 
      "language": "Shell", 
      "raw_url": "https://gist.github.com/braincrash/8901308/raw/eba9667b37218ffb41892411c94abd051b0e269a/only-git-all-the-way.sh", 
      "size": 440 
     } 
    } 
} 

я могу получить все атрибуты, но файлы не будут работать. Вот мое отображение:

RKEntityMapping *fileMapping = [RKEntityMapping mappingForEntityForName:@"File" inManagedObjectStore:managedObjectStore]; 

fileMapping.forceCollectionMapping = YES; 
[fileMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"filename"]; 
[fileMapping addAttributeMappingsFromDictionary:@{@"(filename).raw_url": @"rawURL", 
                @"(filename).size": @"size"}]; 

RKEntityMapping *gistMapping = [RKEntityMapping mappingForEntityForName:@"Gist" inManagedObjectStore:managedObjectStore]; 
[gistMapping addAttributeMappingsFromDictionary:@{ 
                @"id":    @"gistID", 
                @"url":   @"jsonURL", 
                @"html_url":   @"htmlURL"}]; 
gistMapping.identificationAttributes = @[ @"gistID" ]; 

[gistMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"files" toKeyPath:@"files" withMapping:fileMapping]]; 

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:gistMapping method:RKRequestMethodGET pathPattern:@"/gists/public" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

Когда я смотрю на файле внутри суть объекта, я получаю только имя файла, но не URL, ни размера:

filename = "radiation.js"; 
gist = "0xb9742f0 <x-coredata://D37E442D-45BA-4A0E-B7A5-A349F75FA362/Gist/p21>"; 
rawURL = nil; 
size = 0; 

Спасибо за помощь !!

+0

Возможно, потому что ваши имена файлов содержат точки, поэтому они будут испортить навигацию по ключевым путям. Включите ведение журнала трассировки для проверки. У вас есть возможность изменить JSON? – Wain

+0

Вы правы. Я нашел ключ без точек и отлично работал. Yo может добавить ответ с этим, и я буду отмечать его как правильное. Знаете ли вы какое-либо обходное решение этой проблемы? благодаря – amcastror

ответ

0

Ваши имена файлов содержат точки, поэтому они будут беспорядочно перемещаться по пути.

RestKit немного справляется с этим, и я не думаю, что в настоящее время существует решение. Некоторые из них были предложены (https://github.com/RestKit/RestKit/pull/1541/files), но я думаю, что это остается открытой проблемой.

Проблема заключается в том, как узнать, представляет ли точка ключевой путь к пройденному или нет. Теоретически можно определить, но это не обязательно тривиально реализовать в рамках или в исполнении. Вы можете отлаживать использование RKObjectMappingNestingAttributeKeyName и добавлять настраиваемое решение только для этой части.

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