所以我开始在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。
答案 0 :(得分:3)
如果您始终从验证方法返回NO
,则应始终在映射后使用空对象。如果不是这样,那么您有一个基本的KVC验证问题需要调查。
如果您正在使用普通对象映射,那么空对象就可以了,并且将始终返回给您。
如果您正在使用实体映射,那么您可以将某些属性设置为必需(不是可选),然后在映射上配置discardsInvalidObjectsOnInsert
,这样当您不更新某些值时,任何无效对象都将被丢弃(而不是保存)。
所以我认为只要对象被映射或被覆盖,就会触发此方法。因此
self
将包含当前对象,*ioValue
将包含将插入的新值
正确。虽然这只适用于具有唯一标识符的实体映射,因为它允许RestKit查找原始值。