2014-09-23 3 views
0

Отклик я имеюReskit Для Empty Родитель

<people> 
    <person> 
    ... 
    </person> 
    <person> 
    ... 
    </person> 
</people> 

Я хочу сделать отображение человека с моим CoreData контакта объекта. Проблема заключается в том, что нет записей о человеке, у которых ответ имеет пустые теги людей, и это дает мне исключение, если не найдены отображаемые объекты.

Моего отображения как:

+ (RKEntityMapping *)contactMapping { 

    //RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Contact class]]; 
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Contact" 
               inManagedObjectStore:[[HRCoreData sharedInstance] objectStore]]; 

    NSDictionary *mappingDictionary = @{@"id.text": @"contactId", 
            @"title.text": @"title", 
            @"first-name.text": @"firstName", 
            @"last-name.text": @"lastName", 
            @"company-name.text": @"companyName" 
            }; 

    [mapping addAttributeMappingsFromDictionary:mappingDictionary]; 
    mapping.identificationAttributes = @[@"contactId"]; 
    return mapping; 


} 

Ответ установка дескриптор:

RKResponseDescriptor *personResponseDescriptors = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider contactMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"people.person" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[self addResponseDescriptor:personResponseDescriptors]; 

Как проверить, если ребенок существует, или если родитель пуст и сделать отображение соответственно?

@ Edit- Я попытался динамическое отображение таким образом:

+ (RKDynamicMapping *) dynPeopleMapping { 
    // Basic setup 
    RKDynamicMapping* dynamicMapping = [RKDynamicMapping new]; 

    RKEntityMapping *conMapping = [MappingProvider contactMapping]; 
    [conMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"person" toKeyPath:@"Contact" withMapping:dynamicMapping]]; 

    // Configure the dynamic mapping via a block  
    [dynamicMapping setObjectMappingForRepresentationBlock:^RKEntityMapping *(id representation) { 
     if([representation valueForKeyPath:@"people.person"]){ 
      // what can i do here to map person with contact when it exists? 
      return conMapping; 
     }else 
      return nil; 
    }]; 

    return dynamicMapping; 
} 

Но его не картирование контактное лицо в качестве лица, является сбор массива с данными и контакт является одним из основных объектов данных для одного человека. Как я могу их сопоставить?

+0

Вы могли бы использовать динамическое отображение, или иметь сервер возвращает другой код состояния, когда нет никакого содержания. – Wain

+0

@ Спасибо за ответ. Я отредактировал мой пост (нет успеха!) – Dips

+0

Те же ошибки? Я думаю, вам нужно будет использовать только «@» людей »в качестве ключевого пути в дескрипторе ответа, а затем в динамическом сопоставлении. Вам также может понадобиться контейнерный объект. Можете ли вы изменить интерфейс на JSON? Я думаю, что это также проблема, связанная с XML, из-за вложенного ключа. – Wain

ответ

0

Решенный!

Спасибо @Wain. Я просто создал людей nsobject class и person nsmanaged object. Динамическое отображение как:

+ (RKDynamicMapping *) dynPeopleMapping { 
    // Basic setup 
    RKDynamicMapping* dynamicMapping = [RKDynamicMapping new]; 
    RKObjectMapping *peopleMapping = [RKObjectMapping mappingForClass:[HRPeople class]]; 
    RKEntityMapping *personMapping = [MappingProvider contactMapping]; 

    [dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 
     NSLog(@"people.person:%@", [[representation valueForKeyPath:@"people.person"] description]); 
     if([representation valueForKeyPath:@"person"]){ 
      return personMapping; 
     }else 
      return peopleMapping; 
    }]; 
    return dynamicMapping; 
} 

И дескриптор ответа, как:

RKResponseDescriptor *personResponseDescriptors = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider dynPeopleMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"people" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[self addResponseDescriptor:personResponseDescriptors]; 
Смежные вопросы