当RKObjectManager无法发布对象时,如何丢弃一个对象中的CoreData更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当RKObjectManager无法发布对象时,如何丢弃一个对象中的CoreData更改相关的知识,希望对你有一定的参考价值。

当RKObjectManager中此对象的POST / PUT请求失败时,如何丢弃对NSManagedObject实例所做的CoreData更改?

NSManagedObject *object = ...;
[object setValue:@"test" forKey: @"test"];
[[RKObjectManager sharedManager] postObject:object 
                                 parameters:nil 
                                    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { NSLog(@"success, nothing to do"); }
                                    failure:^(RKObjectRequestOperation *operation, NSError *error) { 
  // I want to discard changes made to object here 
}

更新:RestKit 0.20

答案

我对RKObjectManager一无所知,但是为了放弃对NSManagedObject实例的更改,你可以调用:

[object.managedObjectContext refreshObject:object mergeChanges:NO]

这将丢弃所有更改并将对象转为错误。

see here

另一答案

Swift解决方案:

import CoreData

extension NSManagedObject {
    func cancelChanges() {
        managedObjectContext?.refresh(self, mergeChanges: false)
    }
}

使用:

object.cancelChanges()
另一答案

另一种解决方案是自己刷新值。

如果您对某个对象有多个引用,则NSManagedObjectContext中的refresh方法可能会导致问题,特别是如果另一个类在属性上执行KVO。刷新后,您将获得出现故障的对象(所有属性都为零)但处于损坏状态,当您尝试访问任何属性时会收到错误消息_cd_rawData but the object is not being turned into a fault

如果您不想使用单独的上下文和NSUndoManager,则可以使用以下选项:

extension NSManagedObject {
    func revertToCommitedValues() {
        changedValues().keys.forEach { (key) in
            if let persistentValue = committedValues(forKeys: [key])[key] {
                if persistentValue is NSNull {
                    setValue(nil, forKey: key)
                }
                else {
                    setValue(persistentValue, forKey: key)
                }
            }
        }
    }
}

请注意,NSManagedObjectchangedValues方法并不反映关系内部的变化,因此如果您想要“深度重置”,则必须在每个关系上调用该方法

当然,您可以在此方法的基础上仅刷新某些属性。

以上是关于当RKObjectManager无法发布对象时,如何丢弃一个对象中的CoreData更改的主要内容,如果未能解决你的问题,请参考以下文章

在“RKObjectManager”类型的对象上找不到属性“managedObjectStore”

在 RestKit 中使用 RKObjectManager 从 CoreData 获取

维护 RKObjectManager/AFHTTPClient 请求排序

使用 RestKit 和 RKObjectManager 时如何添加一些默认参数?

RKObjectManager 用于 PUT 的正确用法是啥?

特定实体的 RestKit 映射