首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResKit对象映射嵌套对象

ResKit对象映射嵌套对象
EN

Stack Overflow用户
提问于 2015-04-19 23:13:55
回答 1查看 44关注 0票数 0

我试图使用RestKit解析一些JSON。该应用程序是用于跟踪比赛,并有一个场馆,游戏和球员的概念。一场比赛有胜利者和输家(都是班级玩家)和场地。web服务返回的JSON如下所示:

代码语言:javascript
复制
[{"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}}]

我的对象头文件如下所示:

代码语言:javascript
复制
# 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

最后,我的映射设置如下所示:

代码语言:javascript
复制
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调试器查看对象显示如下:

有些东西似乎被打破了--为什么这些字符串显示为“赢家”和“地点”。为什么uid为空?每次我提出请求时,对象看起来都是不同的,这使我相信内存没有得到正确的处理。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 13:22:56

韦恩的评论让我走上了在映射代码之外寻找的道路。我查看了RestKit对象映射文档,发现所有属性都使用nonatomiccopy属性,而不是assign。此外,对象引用(比如PTPlayer *winner就是nonatomic )解决了这个问题。

生成的头文件如下所示:

代码语言:javascript
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29737005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档