【问题标题】:ResKit Object Mapping nested objectsResKit 对象映射嵌套对象
【发布时间】:2015-04-19 23:13:55
【问题描述】:

我正在尝试使用 RestKit 来解析一些 JSON。该应用程序用于跟踪比赛,并具有场地、比赛和球员的概念。一场比赛有一个赢家和输家(都是 Player 类)和一个场地。 Web 服务返回的 JSON 如下所示:

[{"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 调试器查看对象显示:

似乎有些问题 - 为什么这些字符串显示为“winner”和“venue”。为什么uid 为空?每次我提出请求时,对象似乎都不一样,导致我认为内存没有得到正确处理。

有什么想法吗?

【问题讨论】:

  • 映射后对象是否正确?代码看起来不错。建议这是您在其他地方的内存管理。崩溃前运行了哪些代码?

标签: ios objective-c xcode restkit


【解决方案1】:

Wain 的评论使我走上了寻找映射代码之外的道路。我查看了RestKit Object Mapping docs 并注意到所有属性都使用nonatomiccopy 属性,而不是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

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 2020-09-27
    • 2017-07-20
    • 2018-03-17
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多