延迟加载远程数据(RestKit 和 CoreData)

Posted

技术标签:

【中文标题】延迟加载远程数据(RestKit 和 CoreData)【英文标题】:Late Loading of remote Data (RestKit and CoreData) 【发布时间】:2012-04-04 17:37:47 【问题描述】:

我在这个问题上工作了很长时间,但找不到解决方案 适合我的需要。

问题是,我如何加载数据并将它们映射到关系 无需加载整个结构

简单示例:

我们得到了一些鸟:

 
    "birds":[ 
            "bird":"id":"1","value":"LaLeLu", 
            "bird":"id":"2","value":"LeLeLa", 
            ... 
    ] 
 

这可以通过以下方式映射:

RKManagedObjectMapping *birdMapping = [RKManagedObjectMapping 
mappingForClass:[Bird class]]; 
menuMapping.primaryKeyAttribute = @"identifier"; 
[menuMapping mapKeyPath:@"value" toAttribute:@"value"]; 
[menuMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 

[[[RKObjectManager sharedManager] mappingProvider] 
setMappingForKeyPath:"birds.bird"]; 

现在效果很好。

现在每只鸟都可以有很多 cmets - 但我不想加载 所有这些 cmets 都带有第一个请求。

当用户点击特定的鸟时,评论应该会被加载。

所以我请求:

NSString *resourcePath = [NSString stringWithFormat:@"/birds/%@/ 
comments", myBird.id] 
[[RKObjectManager sharedManager] 
loadObjectsAtResourcePath:resourcePath]; 

我可以更改它符合 RestKit 需求的响应 - 但是 有什么需求?

 
    "comments":[ 
            "comment""id":"1","value":"Comment1","bird_id":"1" 
    ] 
 

现在我不知道如何映射此响应。

绘制与鸟类没有任何关系的 cmets 是没有问题的:

RKManagedObjectMapping *commentMapping = [RKManagedObjectMapping 
mappingForClass:[Comment class]]; 
menuMapping.primaryKeyAttribute = @"identifier"; 
[menuMapping mapKeyPath:@"value" toAttribute:@"value"]; 
[menuMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 

[[[RKObjectManager sharedManager] mappingProvider] 
setMappingForKeyPath:"comments.comment"]; 

希望有人理解我的问题并能提供帮助

【问题讨论】:

【参考方案1】:

对于所有对解决方案感兴趣的人:

RestKit 0.10.0 修复问题:

RKManagedObjectMapping *commentMapping = [RKManagedObjectMapping 
mappingForClass:[Comment class]]; 
commentMapping.primaryKeyAttribute = @"identifier"; 
[commentMapping mapKeyPath:@"value" toAttribute:@"value"]; 
[commentMapping mapKeyPath:@"id" toAttribute:@"identifier"];

// Here starts the relevant part:

[commentMapping mapKeyPath:@"bird_id" to Attribute:@"bird_id"];
[commentMapping mapRelationship:@"bird" withMapping:birdMapping];
[commentMapping connectRelationship:@"bird" withObjectPropertyForPrimaryKeyAttribute:"bird_id"]



[[[RKObjectManager sharedManager] mappingProvider] 
    setMapping:commentMapping ForKeyPath:"comments.comment"]; 

【讨论】:

以上是关于延迟加载远程数据(RestKit 和 CoreData)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RestKit 加载多个不相关的对象?

带有 Core Data 陡峭学习曲线的 RestKit 0.10.1

如何在 RESTkit 0.2 中设置缓存策略

使用核心数据在 RestKit 中进行远程服务器搜索

Apple 在导航控制器中延迟加载图像,恢复为占位符图像

使用 RestKit 和 CoreData 同步修改对象的正确方法