RestKit对象映射:使用setObjectMapping的困难:forResourcePathPattern:withFetchRequestBlock
我的设置
以下所有工作正常:
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存储中自动删除已从服务器上删除的通道。 我明白这是支持添加以下内容:
[objectManager.mappingProvider setObjectMapping:chanMapping forResourcePathPattern:@"/channels" withFetchRequestBlock:^ (NSString *resourcePath) { return [Channel fetchRequest]; }];
但是,只要服务器上有新的东西,所有的通道都会被删除。
我试过的东西 [已更新]
我已经使用下面的答案中的步骤进行了debugging。 它看起来好像映射不工作/没有被发现(即我没有正确关联的映射与资源path)。
在deleteCachedObjectsMissingFromResult
, cachedObjects
数组看起来不错,拥有上一次应该在那里的所有对象,但results
数组是空的,这显然导致[results containsObject:object]
总是NO
,所有的对象都被删除。
我是否需要更改某些资源path映射?
我看了你的更新说明。 试试这个:
- 切换回
setObjectMapping:forResourcePathPattern:withFetchRequestBlock
- 设置注册到Channels.channel的映射对象上的
rootKeyPath
然后再试一次。 有一些API工作正在进行中,在一行中提供基于URL和keyPath的映射configuration,但是它尚未合并到开发中。
有两件事要检查,以确定你为什么看到描述的行为:
- 打开RKManagedObjectLoader并在
isResponseMappable
放置一个断点。 此方法检查响应是否从caching中加载,如果返回YES,则使用托pipe对象caching返回的对象执行对象加载。 这可能是你从哪里看到caching对象的返回。 - 至于删除caching的对象,在
deleteCachedObjectsMissingFromResult
放置一个断点,看看里面发生了什么(如果你甚至把它作为例程)。
期望自动修剪的场景是:
- GET /通道返回2xx状态码与新的有效载荷
- RKManagedObjectLoader执行修剪