我有一个使用restKit的iOS应用程序从服务器提取数据并将其持久保存到核心数据中。
背景信息
服务器的响应具有嵌套对象。见下文。
<node>
<entryDate>2013-08-31T20:08:53-06:00</entryDate>
<followId>0</followId>
<ipAddress>255.255.255.0</ipAddress>
<likeStatus>-3</likeStatus>
<nodeId>20</nodeId>
<personId>2</personId>
<point>
<city>Bluffdale</city>
<copy>An amazing discovery was unearthed as a local farmer was plowing his field</copy>
<entryDate>2013-08-31T20:08:53-06:00</entryDate>
<ipAddress>255.255.255.0</ipAddress>
//..... removed some to be concise
<trend>0.0</trend>
</point>
<point>
//there are many points per node all which contain fields like above
</point>
</node>
我创建了两个实体。一个用于节点级数据,一个用于点级数据。我在两者之间有一对多的关系,我正在映射结果。
RKEntityMapping *nodeMapping = [RKEntityMapping mappingForEntityForName:@"NodeLevel" inManagedObjectStore:managedObjectStore];
[nodeMapping addAttributeMappingsFromDictionary:@{
@"followId.text": @"followId",
@"likeStatus.text": @"likeStatus",
@"nodeId.text": @"nodeId",
@"personId.text": @"personId",
@"entryDate.text": @"entryDate"}];
nodeMapping.identificationAttributes = @[ @"nodeId" ];
RKEntityMapping *pointMapping = [RKEntityMapping mappingForEntityForName:@"PointLevel" inManagedObjectStore:managedObjectStore];
[pointMapping addAttributeMappingsFromDictionary:@{
@"nodeId.text": @"nodeId",
@"copy.text": @"paragraph",
//....removed some to be concise
@"trend.text": @"trend"}];
pointMapping.identificationAttributes = @[ @"pointId" ];
[nodeMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"point" toKeyPath:@"node" withMapping:pointMapping]];
目前,节点级数据被映射到节点实体,并且点级数据被映射到点实体。这是我遇到麻烦的地方。
的问题 的
任何给定节点中都有许多点。它们中的每一个都有一个<copy>
字段,我需要用它来填充UITextView。这是我使用非嵌套响应的代码,它运行得很好。
[[RKObjectManager sharedManager] getObjectsAtPath:getArticle parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
self.htmlString = [[mappingResult.firstObject valueForKey:@"paragraph"]description];
if (self.htmlString != nil) {
NSDictionary *options = @{DTUseiOS6Attributes: [NSNumber numberWithBool:YES]};
NSData *htmlData = [self.htmlString dataUsingEncoding:NSUTF8StringEncoding];
NSAttributedString *stringArticle = [[NSAttributedString alloc] initWithHTMLData:htmlData options:options documentAttributes:NULL];
self.newsDetailText.attributedText = stringArticle;
}
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
RKLogError(@"Operation failed with error: %@", error);
}];
但是现在我正在映射嵌套响应,因为the entity NodeLevel is not key value coding-compliant for the key "paragraph"
使用RKMappingResult非常方便,但我不知道如何指定要从中提取的实体。
有人可以为我拼写这个!
答案 0 :(得分:0)
RKMappingResult
可以为您提供已处理的所有对象的数组。该数组中的第一个对象应该是外部对象。您可能会发现更好地记录映射结果提供的数组和字典,以确切地检查您的结果。
无论如何,数组中的第一个对象应该是NodeLevel
的实例,它本身没有paragraph
属性。每个关联的PointLevel
实例都具有该属性。
您可以直接访问映射结果中的点,但您当然可以通过关系(似乎命名为node
?)访问它们。那么问题是你如何决定从哪个点获得paragraph
。