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

所以我开始在RestKit中实现我的第二个项目,前一个很简单,只是从远程服务中提取东西,并填入我的核心数据库。 在当前的应用程序中,我正在开发一个同步function,所以我想在做一个插入之前validation东西,即比较本地存储中的一个对象与从远程服务获得的对象。

我正在读这个线程 ,发现我可以做到这样的事情。 所以我将这两种方法添加到我的模型中。 我知道只有一个方法就足够了,但问题是两个function。

@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; 

所以我认为这个方法是每当一个对象被映射或被覆盖时触发的。 所以自我将包含当前的对象和* ioValue将包含将插入或不是新的价值,是我的结论是正确的?

现在,当我的应用程序self.title触发该方法,并且* ioValue包含相同的值 ,这是来自服务的新值 ,self.title不包含本地存储中的旧值(可能是对数据库的更改已经发生:()。如果我从这个方法返回没有logging仍然被映射,这不应该发生的权利?

任何关于这个问题的见解都会有很大的帮助。 我正在从头开始,而不使用RestKit的边缘。

如果你总是从validation方法返回NO ,那么在映射之后,你总是应该得到空的对象。 如果这不是真的,那么你有一个基本的KVCvalidation问题进行调查。

如果您使用的是简单的对象映射,那么空对象就可以正常使用,并且会一直返回给您。

如果您正在使用实体映射,则可以将某些属性设置为强制(不是可选),然后在映射上configurationdiscardsInvalidObjectsOnInsert ,以便在不更新某些值时,将丢弃(而不是保存)任何无效对象。

所以我认为这个方法在对象被映射或被覆盖的时候被触发。 所以self将包含当前对象, *ioValue将包含将被插入的新值

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