0

我的设置

以下一切正常:

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 时已从服务器中删除。我了解通过添加以下内容来支持这一点:

[objectManager.mappingProvider setObjectMapping:chanMapping forResourcePathPattern:@"/channels" withFetchRequestBlock:^ (NSString *resourcePath) { 
        return [Channel fetchRequest];
    }];

但是,只要服务器上有任何新内容,所有频道都会被删除。

我尝试过的事情[更新]

我已经使用下面答案中的步骤进行了调试。看起来好像映射不起作用/没有找到(即我没有正确地将映射与资源路径相关联)。

在数组中看起来不错,具有上次应该存在的所有对象,但deleteCachedObjectsMissingFromResult数组是空的,这显然导致始终存在并且所有对象都被删除。cachedObjectsresults[results containsObject:object]NO

我是否需要更改与资源路径映射有关的内容?

4

2 回答 2

2

我看了你更新的描述。试试这个:

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

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

于 2012-05-16T13:22:48.587 回答
1

要检查两件事以确定您看到所描述行为的原因:

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

期望自动修剪的场景是:

  1. GET /channels 返回带有新负载的 2xx 状态码
  2. RKManagedObjectLoader 执行修剪
于 2012-05-14T17:11:53.753 回答