#iphone #objective-c #restkit
#iPhone #objective-c #restkit
Вопрос:
на данный момент просто пытаюсь привыкнуть к приложениям restkit для iphone и натыкаюсь на стену. Я пытаюсь получить данные из вложенного файла json.
[
{"person": {
"name": "joe",
"id": "1234",
"numbers":
[
{"value": "555-12125"},
{"value": "222-12125"}
]
}
}]
я настроил rkobjectmanager следующим образом
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:3000"];
[manager loadObjectsAtResourcePath:@"/J.json?user_id=36995582amp;planner=insta-grammar" objectClass:[Person class] delegate:self] ;
[manager registerClass:[Person class] forElementNamed:@"person"];
[manager registerClass:[Numbers class] forElementNamed:@"numbers"];
затем класс person и класс numbers следующим образом
#import "Person.h"
@implementation Person
@synthesize _name,_id,_number;
(NSDictionary*)elementToPropertyMappings {
return [NSDictionary dictionaryWithKeysAndObjects:
@"name",@"name",
@"id",@"id",nil];
}
(NSDictionary*)elementToRelationshipMappings {
return [NSDictionary dictionaryWithKeysAndObjects:
@"numbers", @"numbers",
nil];
}
@end
#import "Numbers.h"
@implementation Numbers
@synthesize _number;
(NSDictionary*)elementToPropertyMappings {
return [NSDictionary dictionaryWithKeysAndObjects:
@"value",@"value",nil];
}
(NSString*)primaryKeyProperty {
return @"value";
}
(NSDictionary*)relationshipToPrimaryKeyPropertyMappings {
return [NSDictionary dictionaryWithObject:@"value" forKey:@"value"];
}
@end
но каждый раз _number остается пустым после вызова функции didloadobjects, в то время как переменные name и id заполняются нормально.
есть идеи по этому поводу?.
я попробовал пример на git, но не смог заставить его работать, поэтому буду признателен за любую помощь.
спасибо
g
Ответ №1:
Что вам нужно сделать, так это объявить NSArray *_numbers
переменную-член в Person.h, придать ей свойство like @property (nonatomic, retain) NSArray *_numbers
и синтезировать его в Person.m like @synthesize numbers = _numbers
. Затем вы можете избавиться от любого значения _number, поскольку вы не будете хранить один объект number, вы будете хранить массив объектов number.
Вместо этого ваш класс Numbers должен быть просто Number, и вы должны синтезировать свою переменную number следующим образом @synthesize number = _number;
. Итак, ваш Number.m должен выглядеть как
@implementation Number
@synthesize number = _number;
(NSDictionary *)elementToPropertyMappings {
return [NSDictionary dictionaryWithKeysAndObjects:
@"value", @"number", nil];
}
Поскольку вашим свойством является number, значение словаря сопоставления равно @"number"
, в то время как ваш исходный ключ JSON должен быть @"value"
.
Затем вы можете загружать объекты, подобные (обратите внимание, что мы используем наш Number
класс для @"numbers"
элемента):
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:3000"];
[manager registerClass:[Person class] forElementNamed:@"person"];
[manager registerClass:[Number class] forElementNamed:@"numbers"];
[manager loadObjectsAtResourcePath:@"/J.json?user_id=36995582amp;planner=insta-grammar" delegate:self];
Полный пример смотрите в Примере каталога в проекте RestKit на github
Комментарии:
1. Нет, он все еще не работает. на самом деле класс number даже никогда не вызывается. я попробовал пример catalog и использовал его классы вместо своих и назвал их так же, как в примере, и все еще без радости. он по-прежнему загружается только в виде данных, отличных от массива.
Ответ №2:
Просто для тех, кто следит за этим. Наконец-то все это заработало, используя новый OM2, который они только что выпустили с restkit. очень приятное и простое в использовании изменение
Комментарии:
1. На мой взгляд, я думаю, вам следовало принять ответ бенснайдера, а не свой собственный, поскольку он ответил на ваш конкретный вопрос. Верно, OM2 — лучший способ, но его ответ касался обстоятельств, представленных в вашем вопросе.
2. я понимаю вашу точку зрения, но я попробовал это так, как сказал бенснайдер, и у меня все равно ничего не получилось. ответ, который он дал, возможно, был на 100% правильным, но если у меня это не сработало, я не вижу, как я могу проголосовать за это как за правильное, извините.