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
如果Context
的modified
date不同,我想将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是空白的。 对象如何从mappingResult
到MOC
?
下面的选项无法正常工作,因为即使保存未传播到持久性存储,MOC也会被保存,因此您无法就其更改进行询问。 你可以用同样的方法使用多个上下文,但是:
RestKit能够使用KVCvalidation。 因此,您可以在模型对象上实现多个方法并添加validation逻辑。 这些方法用新的传入数据调用,并可以访问当前数据( self
的实例variables),以便检查传入值并检查是否要:
- 接受
- 更改
- 完全中止映射
看到这个参考 。
从MOC你可以得到updatedObjects
。 一旦你有更新的对象,你可以得到changedValues
每个。 现在,使用该字典中的键,可以使用committedValuesForKeys:
获得以前保存的值。
现在你有所有需要的信息来进行比较。 你应该处理每个键并应用任何你想要的逻辑。 作为处理的一部分,您可以将一些variables更改回其保存的值,或使用refreshObject:mergeChanges:
重置整个对象refreshObject:mergeChanges:
在处理结束时,保存上下文。
您不应该使用多个不同的上下文来实现这一点,尽pipe您应该使用与标准主队列上下文不同的上下文。