2014-04-29 61 views
2

我已保存的对象(持久)之前依然存在。可以说下面是值: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

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

我想我将不得不手动检查:

if (!([objectInCoreData valueForKey:@"firstName"] isEqualToString:[objectInContext [email protected]"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:我在哪里测试,如果每个属性发生了变化?在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

回答

3

下面的选项无法正常工作,因为即使保存未传播到持久性存储,MOC也会保存,因此您无法就其更改提出要求。你可以使用多种环境使用相同的方法,但是:

RestKit能够使用KVC验证。因此,您可以在模型对象上实现多种方法并添加验证逻辑。这些方法称为新传入的数据,并有机会获得当前数据(的self实例变量),这样你可以检查传入的值和检查,如果你想:

  1. 接受
  2. 改变它
  3. 中止映射共

参见this ref


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

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

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

尽管您应该使用与标准主队列上下文不同的上下文,但您不应该使用多个不同的上下文来实现此目的。

+0

谢谢!我对这个问题做了更新,你能告诉我,如果我走在正确的道路上吗?我错过了什么B/C一切都是作为0或null。 – user1107173

+2

你有没有得到'updatedObjects'或者它是空的?这可能是MOC被保存,但没有传播到持久存储... – Wain

+0

我添加了日志。 updatedObjects是空的。我得到28个物体。我有SQLite管理器,我没有看到添加到商店的任何更改。 – user1107173