Restkit возвращает 0 объектов в ObjectLoader: didLoadObjects:

#iphone #ios #restkit

#iPhone #iOS #restkit

Вопрос:

Итак, я пытаюсь вернуть массив объектов таблицы лидеров из базы данных, используя вызовы rest. didLoadObjects возвращает 0 объектов, даже если отображение кажется правильным:

  RKObjectManager *svc = [RKObjectManager sharedManager];
 NSString *resourcePath = leaderboardResourcePath;
 RKObjectMapping* mapping = [svc.mappingProvider objectMappingForClass:[Leaderboard class]];
 RKObjectLoader *loader = [[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath objectMapping:mapping delegate:self];
 

Вот метод didLoadObjects

 - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects { 
    if ([objectLoader.resourcePath isEqualToString:leaderboardResourcePath])
    {
        @synchronized(standings)
        {
             standings = objects;
        }
    }
}    
 

Вот код сопоставления:

   (void)setMappings
{
    //Standings mapping
    RKObjectMapping* leaderboardMapping = [RKObjectMapping mappingForClass:[Leaderboard class]];
    [leaderboardMapping mapKeyPath:@"uname" toAttribute:@"uname"];
    [leaderboardMapping mapKeyPath:@"geo" toAttribute:@"geo"];
    [leaderboardMapping mapKeyPath:@"week" toAttribute:@"week"];
    [leaderboardMapping mapKeyPath:@"year" toAttribute:@"year"];
    [leaderboardMapping mapKeyPath:@"pts" toAttribute:@"pts"];  

    [[RKObjectManager sharedManager].mappingProvider addObjectMapping:leaderboardMapping];

    RKObjectRouter *router = [RKObjectManager sharedManager].router;

    // Define a default resource path for all unspecified HTTP verbs  
    [router routeClass:[Leaderboard class] toResourcePath:leaderboardResourcePath];  
}
 

Обновить

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

   (void)setMappings
{
    //Standings mapping
    RKObjectMapping* geoMapping = [RKObjectMapping mappingForClass:[Geo class]];
    [geoMapping mapKeyPath:@"lat" toAttribute:@"lat"];
    [geoMapping mapKeyPath:@"lng" toAttribute:@"lng"];
    [geoMapping mapKeyPath:@"place" toAttribute:@"place"];

    [[RKObjectManager sharedManager].mappingProvider addObjectMapping:geoMapping];
    [[RKObjectManager sharedManager].mappingProvider setMapping:geoMapping forKeyPath:@"geo"];   
}

  (void)initialize{
    [super initialize];
    if ([self class] == [Geo class]) {
        [self setMappings];
    } 
}
 

Это приводит к тому, что didLoadObjects корректно передает объекты обратно, но геообъект объекта Leaderboard по-прежнему возвращает значение null. Мысли?

Комментарии:

1. Привет, Рад, что вы нашли решение. Пожалуйста, предоставьте решение в качестве вашего ответа и можете удалить из фактического вопроса.

2. спасибо за совет @iDroid Я пошел дальше и сделал это.

Ответ №1:

РЕШЕНО

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

   (void)setMappings
{
    RKObjectMapping* leaderboardMapping = [RKObjectMapping mappingForClass:[Leaderboard class]];
    [leaderboardMapping mapAttributes:@"uname", @"week", @"year",  @"pts", nil];

    // Define the relationship mapping
    [leaderboardMapping mapKeyPath:@"geo" toRelationship:@"geo" withMapping:[Geo getMapping]];

    [[RKObjectManager sharedManager].mappingProvider addObjectMapping:leaderboardMapping];
}
 

Вот геообъект:

  (RKObjectMapping*) getMapping{
    RKObjectMapping* geoMapping = [RKObjectMapping mappingForClass:[Geo class]];
    [geoMapping mapAttributes:@"lat", @"lng", @"place", nil];
    return geoMapping; 
}