RestKit对象映射:使用setObjectMapping时遇到困难:forResourcePathPattern:withFetchRequestBlock

时间:2012-05-09 13:19:50

标签: objective-c ios core-data restkit

我的设置

以下一切正常:

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并且所有对象都被删除。

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

2 个答案:

答案 0 :(得分:2)

我查看了您的更新说明。试一试:

  1. 切换回setObjectMapping:forResourcePathPattern:withFetchRequestBlock
  2. 将您注册的对象映射上的rootKeyPath设置为Channels.channel
  3. 然后再试一次。有一些API正在进行中,以便在一行中提供基于URL和keyPath的映射配置,但它尚未合并到开发中。

答案 1 :(得分:1)

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

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

    1. GET / channels返回带有新有效负载的2xx状态代码
    2. RKManagedObjectLoader执行修剪