#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;
}