我在Core Data中有一个保存的对象(持久化)。让我们说以下是值:
//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
如果modified
中的Context
日期不同,我想将attribute
中的每个Context
与Core中保留的Context
进行比较数据。如果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];
与持久化的不同,我需要为每个属性属性触发一个标志。一旦所有属性都被追踪,我可以通过保存Context来覆盖该对象。
我想我必须手动检查:
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) {}
问题1:我觉得有更好的方法可以做到这一点。什么是最佳做法?
如何简化检查15种不同属性的代码?
问题2:如果每个属性都发生了变化,我在哪里测试?在successBlock里面? wilSave:方法?
**更新 *
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
日志
mappingResult
我可以看到我收到一些对象的日志,但是一切都是null或0.我猜我的MOC是空白的。对象如何从MOC
转到{{1}}?
答案 0 :(得分:3)
以下选项无法正常工作,因为即使保存未传播到持久存储,MOC也会保存,因此您无法询问其更改。您可以使用相同的方法使用多个上下文,但是:
RestKit能够使用KVC验证。因此,您可以在模型对象上实现许多方法并添加验证逻辑。这些方法使用新的传入数据调用,并且可以访问当前数据(self
的实例变量),因此您可以检查传入的值并检查是否要:
请参阅this ref。
您可以从MOC获得updatedObjects
。获得更新的对象后,每个对象都可以获得changedValues
。现在,使用该词典中的键,您可以使用committedValuesForKeys:
获取以前保存的值。
现在您拥有进行比较所需的所有信息。您应该处理每个键并应用您想要的任何逻辑。作为处理的一部分,您可以将某些变量更改回其保存的值,或使用refreshObject:mergeChanges:
重置整个对象。
在处理结束时,保存上下文。
您不应该使用多个不同的上下文来实现此目的,尽管您可能应该使用与标准主队列上下文不同的上下文。