我的设置
以下一切正常:
RKManagedObjectMapping* chanMapping = [RKManagedObjectMapping mappingForClass:[Channel class] inManagedObjectStore:objectStore];
chanMapping.primaryKeyAttribute = @"chanId";
[chanMapping mapKeyPathsToAttributes:
@"id",@"chanId",
@"name", @"chanName",
nil];
[objectManager.mappingProvider setMapping:chanMapping forKeyPath:@"Channels.channel"];
我可以打电话
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/channels" delegate:self];
我从服务器获取我的频道,它们由Core Data本地存储。完美。
问题
但是,我现在不想让RestKit自动删除下次执行GET时已从服务器中删除的Core Data存储中的Channels。我理解这可以通过添加以下内容来支持:
[objectManager.mappingProvider setObjectMapping:chanMapping forResourcePathPattern:@"/channels" withFetchRequestBlock:^ (NSString *resourcePath) {
return [Channel fetchRequest];
}];
然而,只要服务器上有任何新内容,就会删除所有频道。
我尝试过的事情 [已更新]
我使用下面答案中的步骤进行了调试。看起来好像映射不起作用/没有找到(即我没有正确地将映射与资源路径相关联)。
在deleteCachedObjectsMissingFromResult
中,cachedObjects
数组看起来不错,上一次应该存在的所有对象,但results
数组为空,这显然导致[results containsObject:object]
始终为NO
并且所有对象都被删除。
我是否需要更改与资源路径映射有关的内容?
答案 0 :(得分:2)
我查看了您的更新说明。试一试:
setObjectMapping:forResourcePathPattern:withFetchRequestBlock
rootKeyPath
设置为Channels.channel 然后再试一次。有一些API正在进行中,以便在一行中提供基于URL和keyPath的映射配置,但它尚未合并到开发中。
答案 1 :(得分:1)
要检查两件事以确定您看到所述行为的原因:
isResponseMappable
内放置一个断点。此方法检查响应是否从缓存加载,如果返回YES,则使用托管对象缓存返回的对象执行对象加载。这可能是您看到缓存对象返回的地方。deleteCachedObjectsMissingFromResult
内放置一个断点,看看那里发生了什么(如果你甚至把它放到例程中)。期望自动修剪的方案是: