2015-04-19 3 views
0

Я пытаюсь использовать RestKit для разбора некоторых JSON. Приложение предназначено для отслеживания соревнований и имеет концепцию мест проведения, игр и игроков. В игре есть победитель и проигравший (оба игрока класса) и место проведения. JSON, возвращаемый веб-службы выглядит следующим образом:ResKit Object Сопоставление вложенных объектов

[{"id":1,"winner":{"name":"NAME2","id":2,"picture_url":"CK.png"},"loser":{"name":"NAME3","id":3,"picture_url":"NJ.png"},"venue":{"name":"Venue 1","id":2}}, 
{"id":2,"winner":{"name":"NAME2","id":2,"picture_url":"CK.png"},"loser":{"name":"NAME1","id":1,"picture_url":"NC.png"},"venue":{"name":"Venue 1","id":2}}, 
{"id":3,"winner":{"name":"NAME2","id":2,"picture_url":"CK.png"},"loser":{"name":"NAME3","id":3,"picture_url":"NJ.png"},"venue":{"name":"Venue 1","id":2}}, 
{"id":4,"winner":{"name":"NAME2","id":2,"picture_url":"CK.png"},"loser":{"name":"NAME1","id":1,"picture_url":"NC.png"},"venue":{"name":"Venue 1","id":2}}] 

Мои файлы заголовков объекта выглядеть следующим образом:

# PTGame.h 
@interface PTGame : NSObject 
@property (nonatomic, assign) NSNumber *uid; 
@property (nonatomic, assign) PTPlayer *winner; 
@property (nonatomic, assign) PTPlayer *loser; 
@property (nonatomic, assign) PTVenue *venue; 
@end 

# PTVenue.h 
@interface PTVenue : NSObject 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, assign) NSNumber *uid; 
-(CLLocation *)location; 
-(CLLocationDistance)distanceFromLocation:(CLLocation *)location; 
@end 

# PTPlayer.h 
@interface PTPlayer : NSObject 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *pictureUrl; 
@property (nonatomic, assign) NSNumber *uid; 
@end 

Наконец, мои настройки отображения выглядит следующим образом:

RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; 

RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[PTVenue class]]; 
[venueMapping addAttributeMappingsFromDictionary:@{@"name"  : @"name", 
                @"id"  : @"uid"}]; 

RKObjectMapping *playerMapping = [RKObjectMapping mappingForClass:[PTPlayer class]]; 
[playerMapping addAttributeMappingsFromDictionary:@{@"name"  : @"name", 
                @"id"   : @"uid", 
                @"picture_url": @"pictureUrl"}]; 

// Add Object Mapping for PTGame 
RKObjectMapping *gameResponseMapping = [RKObjectMapping mappingForClass:[PTGame class]]; 

// Setup Game Object relationships 
[gameResponseMapping addAttributeMappingsFromDictionary:@{@"id": @"uid"}]; 
[gameResponseMapping addRelationshipMappingWithSourceKeyPath:@"winner" mapping:playerMapping]; 
[gameResponseMapping addRelationshipMappingWithSourceKeyPath:@"loser" mapping:playerMapping]; 
[gameResponseMapping addRelationshipMappingWithSourceKeyPath:@"venue" mapping:venueMapping]; 

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); 

RKResponseDescriptor *gameListResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:gameResponseMapping 
                           method:RKRequestMethodGET 
                          pathPattern:@"/games.json" 
                           keyPath:nil 
                          statusCodes:statusCodes]; 
[objectManager addResponseDescriptor:gameListResponseDescriptor]; 

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

Что-то кажется сломанным - почему эти строки показывают как «победитель» и «место». Почему uid null? Объекты кажутся разными каждый раз, когда я делаю запрос, заставляя меня поверить, что память не обрабатывается должным образом.

Любые идеи?

+1

ли объекты правильно после отображения кода выглядит нормально? Предполагает, что это ваше управление памятью в другом месте. Какой код работал до сбоя? – Wain

ответ

0

Wain комментарий привел меня вниз, чтобы посмотреть вне кода отображения. Я посмотрел в RestKit Object Mapping docs и заметил, что все атрибуты использовали свойства nonatomic и copy, а не assign. Кроме того, ссылки на объекты (такие как PTPlayer *winner были просто nonatomic Изменение моего кода, чтобы отразить это исправили проблему

получившиеся файлы заголовков выглядеть следующим образом:..

# PTPlayer.h 
@interface PTPlayer : NSObject 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *pictureUrl; 
@property (nonatomic, copy) NSNumber *uid; 
@end 

# PTVenue.h 
@interface PTVenue : NSObject 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSNumber *uid; 
@property (nonatomic, assign) CGFloat longitude; 
@property (nonatomic, assign) CGFloat latitude; 
-(CLLocation *)location; 
-(CLLocationDistance)distanceFromLocation:(CLLocation *)location; 
@end 


# PTGame.h 
@interface PTGame : NSObject 
@property (nonatomic, copy) NSNumber *uid; 
@property (nonatomic) PTPlayer *winner; 
@property (nonatomic) PTPlayer *loser; 
@property (nonatomic) PTVenue *venue; 
@end 
Смежные вопросы