15

当该对象的 POST/PUT 请求在 RKObjectManager 中失败时,如何丢弃对 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

4

3 回答 3

45

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

[object.managedObjectContext refreshObject:object mergeChanges:NO]

这将丢弃所有更改并将对象变为故障。

看这里

于 2013-04-11T09:30:58.390 回答
3

快速解决方案:

import CoreData

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

使用:

object.cancelChanges()
于 2017-11-13T19:44:27.400 回答
0

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

NSManagedObjectContext如果您对一个对象有多个引用,尤其是另一个类正在对属性执行 KVO 时,来自 的 refresh 方法可能会导致问题。刷新后,您将获得有故障的对象(所有属性均为 nil)但处于损坏状态,_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)
                }
            }
        }
    }
}

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

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

于 2019-04-25T01:06:39.603 回答