ios - RESTKit:在覆盖之前将 GET 对象与本地持久化对象进行比较

标签 ios core-data restkit restkit-0.20 key-value-coding

我在核心数据中有一个保存的对象(持久化)。让我们说以下是值:

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

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

我设置了operation.savesToPercientStore = 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

我相信此时修改的对象位于managementObjectContext

如果上下文中的修改日期不同,我想比较上下文中的每个属性 > 与核心数据中持久存在的一个。如果 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];

问题 1:我感觉有更好的方法可以做到这一点。最佳实践是什么?
如何简化检查 15 个不同属性的代码?

问题 2:在哪里测试每个属性是否已更改?在成功 block 内?威尔保存:方法?

** 更新*

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

我可以看到日志显示我收到了一些对象,但所有内容都是 null 或 0。我猜我的 MOC 是空白的。对象如何从 mappingResultMOC

最佳答案

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

RestKit 能够使用 KVC 验证。因此,您可以在模型对象上实现许多方法并添加验证逻辑。这些方法使用新的传入数据进行调用,并且可以访问当前数据(self 的实例变量),因此您可以检查传入值并检查是否需要:

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

参见this ref .


从 MOC 中您可以获得updatedObjects。获得更新的对象后,您可以获得每个对象的 changedValues。现在,使用该字典中的键,您可以使用 comfilledValuesForKeys: 获取以前保存的值。

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

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

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

关于ios - RESTKit:在覆盖之前将 GET 对象与本地持久化对象进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23355231/

相关文章:

iphone - 为什么 CoreData 没有链接到我移植的 iOS->Mac 应用程序中?

ios - RestKit本地删除对象,仍然出现在映射中

ios - 如何迁移到 Xcode 12.5

ios - 将嵌入 NSAttributedString(通过 NSTextAttachment)的图像视为单个字符,这样它就不会断行?

sqlite - 在 iOS 项目中管理 coredata/sqlite 数据库生命周期

ios - 如何将 PUT 请求添加到 RestKit + Core Data?

ios - 使用 RestKit 同时调用两个 webservices

ios - 无法使用 if 条件 Swift 4.0 更改文本的颜色

iOS 在 TableView 中显示的标题截断从 titleForHeaderInSection 返回的字符串

ios - 核心数据一对多关系