RESTKit:在覆盖之前比较GET对象和本地持久化

核心数据中有一个保存的对象(保留)。 可以说下面是值:

//Entity: employee objectID: 1111 firstName: @"Jon" lastName: @"D" modified: @"10:45PM" 

现在,我执行一个RKManagedObjectRequestOperation *operation请求。

我设置了operation.savesToPersistentStore = NO; 并开始操作。

该对象被下载并被修改为以下内容:

 //Entity: employee objectID: 1111 firstName: @"Jonathan" lastName: @"Doe" modified: @"10:55PM" //I have 15 other properties that are either Strings, NSDate, NSNumber, and BOOLs 

我相信在这个时候被修改的对象在managedObjectContext

如果Contextmodifieddate不同,我想将Context每个attribute与核心数据中保留的attribute进行比较。 如果Context attribute与持久化attribute不同,我需要为每个属性属性触发一个标志。 一旦所有的属性都被窜改,我可以通过保存上下文来覆盖对象。

我想我必须手动检查:

 if (!([objectInCoreData valueForKey:@"firstName"] isEqualToString:[objectInContext valueForKey@"firstName"])) { firstNameValueChange = YES; // Trigger this flag // I have to trigger a flag for each attribute that's changed to show // the changed value in the tableView in a different color } //Continue to check for each attribute, and at end overwrite persisted with Context by [self.managedObjectContext save:&error]; 

问题1:我有一种感觉,有更好的方法来做到这一点。 最佳做法是什么?
我怎样才能简化检查15个不同属性的代码?

问题2:如果每个属性都改变了,我在哪里testing? 在successBlock里面? wilSave:方法?

**更新*

 RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]]; operation.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext; operation.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache; operation.savesToPersistentStore = NO; [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { NSSet *updatedObjects = [self.managedObjectContext updatedObjects]; NSLog(@"updatedObjects Count %i", updatedObjects.count); NSArray *_updatedObjects = updatedObjects.allObjects; NSLog(@"_updatedObjects Count %i", _updatedObjects.count); for (int i = 0; i<_updatedObjects.count; i++) { Invite *invite = [_updatedObjects objectAtIndex:i]; NSDictionary *changedValues = [invite changedValues]; } }failure:^(RKObjectRequestOperation *operation, NSError *error) {} 

日志

  I restkit.network:RKObjectRequestOperation.m:250 GET 'http://www.domain.com/api?lastrequest=2014-04-22T07%3A06%3A34Z' (200 OK / 28 objects) [request=0.1140s mapping=0.0865s total=0.3034s] 2014-04-29 07:06:43.112 App[10627:60b] updatedObjects Count 0 2014-04-29 07:06:43.112 App[10627:60b] _updatedObjects Count 0 

我可以看到我得到一些对象的日志,但一切都是零或0.我想我的MOC是空白的。 对象如何从mappingResultMOC

下面的选项无法正常工作,因为即使保存未传播到持久性存储,MOC也会被保存,因此您无法就其更改进行询问。 你可以用同样的方法使用多个上下文,但是:

RestKit能够使用KVCvalidation。 因此,您可以在模型对象上实现多个方法并添加validation逻辑。 这些方法用新的传入数据调用,并可以访问当前数据( self的实例variables),以便检查传入值并检查是否要:

  1. 接受
  2. 更改
  3. 完全中止映射

看到这个参考 。


从MOC你可以得到updatedObjects 。 一旦你有更新的对象,你可以得到changedValues每个。 现在,使用该字典中的键,可以使用committedValuesForKeys:获得以前保存的值。

现在你有所有需要的信息来进行比较。 你应该处理每个键并应用任何你想要的逻辑。 作为处理的一部分,您可以将一些variables更改回其保存的值,或使用refreshObject:mergeChanges:重置整个对象refreshObject:mergeChanges:

在处理结束时,保存上下文。

您不应该使用多个不同的上下文来实现这一点,尽pipe您应该使用与标准主队列上下文不同的上下文。