当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]
这将丢弃所有更改并将对象转为错误。
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)
}
}
}
}
}
请注意,NSManagedObject
的changedValues
方法并不反映关系内部的变化,因此如果您想要“深度重置”,则必须在每个关系上调用该方法
当然,您可以在此方法的基础上仅刷新某些属性。