RestKit在映射或实际插入CoreData DB之前比较本地对象和远程对象

时间:2014-06-20 10:25:15

标签: ios core-data restkit restkit-0.20

所以我开始在RestKit中实现我的第二个项目,前一个非常简单,只需从远程服务中提取内容并填写我的核心数据db。在当前的应用程序中,我正在进行同步功能,因此我想在进行插入之前验证内容,即将本地存储中的对象与从远程服务获取的对象进行比较。

我正在阅读 this thread并发现我可以实现这样的目标。所以我将这两种方法添加到我的模型中。我知道只有一种方法就够了,但问题在于两种功能。

@implementation News

@dynamic title;
@dynamic desc;
@dynamic time;
@dynamic category;
@dynamic content;

- (BOOL)validateValue:(inout __autoreleasing id *)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError *__autoreleasing *)outError{
    return NO;
}

- (BOOL)validateTitle:(id *)ioValue error:(NSError **)outError{
    return NO;
}

实体映射代码

 RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass(theClass) inManagedObjectStore:objectManager.managedObjectStore];

 userMapping.performsKeyValueValidation = YES;
 userMapping.discardsInvalidObjectsOnInsert = YES;

所以我认为只要对象被映射或被覆盖,就会触发此方法。所以self会包含当前对象,而* ioValue将包含将插入或不插入的新值,对此我的结论是正确的吗?

现在,当我的应用 self.title 触发该方法时, * ioValue 包含相同值,即来自service和self.title的新值不包含本地存储中的旧值(可能已经发生了对db的更改:()。另外如果我从此方法返回No,则记录仍然得到映射,这不应该发生吗?

对此问题的任何见解都会有很多帮助。我即将从头开始而不使用RestKit。

1 个答案:

答案 0 :(得分:3)

如果您始终从验证方法返回NO,则应始终在映射后使用空对象。如果不是这样,那么您有一个基本的KVC验证问题需要调查。

如果您正在使用普通对象映射,那么空对象就可以了,并且将始终返回给您。

如果您正在使用实体映射,那么您可以将某些属性设置为必需(不是可选),然后在映射上配置discardsInvalidObjectsOnInsert,这样当您不更新某些值时,任何无效对象都将被丢弃(而不是保存)。

  

所以我认为只要对象被映射或被覆盖,就会触发此方法。因此self将包含当前对象,*ioValue将包含将插入的新值

正确。虽然这只适用于具有唯一标识符的实体映射,因为它允许RestKit查找原始值。