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)。

deleteCachedObjectsMissingFromResultcachedObjects数组看起来不错,拥有上一次应该在那里的所有对象,但results数组是空的,这显然导致[results containsObject:object]总是NO ,所有的对象都被删除。

我是否需要更改某些资源path映射?

我看了你的更新说明。 试试这个:

  1. 切换回setObjectMapping:forResourcePathPattern:withFetchRequestBlock
  2. 设置注册到Channels.channel的映射对象上的rootKeyPath

然后再试一次。 有一些API工作正在进行中,在一行中提供基于URL和keyPath的映射configuration,但是它尚未合并到开发中。

有两件事要检查,以确定你为什么看到描述的行为:

  1. 打开RKManagedObjectLoader并在isResponseMappable放置一个断点。 此方法检查响应是否从caching中加载,如果返回YES,则使用托pipe对象caching返回的对象执行对象加载。 这可能是你从哪里看到caching对象的返回。
  2. 至于删除caching的对象,在deleteCachedObjectsMissingFromResult放置一个断点,看看里面发生了什么(如果你甚至把它作为例程)。

期望自动修剪的场景是:

  1. GET /通道返回2xx状态码与新的有效载荷
  2. RKManagedObjectLoader执行修剪