Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当RKObjectManager无法发布对象时,如何放弃一个对象中的CoreData更改_Ios_Objective C_Core Data_Restkit - Fatal编程技术网

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

Ios 当RKObjectManager无法发布对象时,如何放弃一个对象中的CoreData更改,ios,objective-c,core-data,restkit,Ios,Objective C,Core Data,Restkit,在RKObjectManager中,当NSManagedObject的POST/PUT请求失败时,如何放弃对该对象实例所做的CoreData更改 NSManagedObject *object = ...; [object setValue:@"test" forKey: @"test"]; [[RKObjectManager sharedManager] postObject:object parameters:nil

在RKObjectManager中,当NSManagedObject的POST/PUT请求失败时,如何放弃对该对象实例所做的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刷新对象:对象合并更改:否]

这将放弃所有更改,并将对象变为故障


Swift解决方案:

import CoreData

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

object.cancelChanges()

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

如果对一个对象有多个引用,特别是当另一个类正在对属性执行KVO时,
NSManagedObjectContext
中的刷新方法可能会导致问题。刷新后,您将获得出现故障(所有属性均为零)但处于断开状态的对象,接收到错误消息
\u cd\u rawData,但当您尝试访问任何属性时,该对象未变为故障

如果您不想使用单独的上下文和
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
changedvalue
方法并不反映关系内部的更改,因此如果您想要“深度重置”,您必须在每个关系上调用该方法

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