Ios 重置托管对象上下文无效

Ios 重置托管对象上下文无效,ios,uitableview,core-data,restore,nsmanagedobjectcontext,Ios,Uitableview,Core Data,Restore,Nsmanagedobjectcontext,我在UI线程中有一个主托管对象上下文(MOC),它通常由工作线程更新。很好 但是,我有一个视图,其中我在UI线程中创建了另一个MOC(称为editingMOC)。我在编辑MOC中通过objectID阅读myObject。之后,我在编辑MOC中对对象myObject进行了一些修改。如果用户点击取消,则会发生以下情况: [self.editingMOC reset]; myObjectEdit = [self.editingMOC existingObjectWithID:myObject.obj

我在UI线程中有一个主托管对象上下文(MOC),它通常由工作线程更新。很好

但是,我有一个视图,其中我在UI线程中创建了另一个MOC(称为editingMOC)。我在编辑MOC中通过objectID阅读myObject。之后,我在编辑MOC中对对象
myObject
进行了一些修改。如果用户点击
取消
,则会发生以下情况:

[self.editingMOC reset];

myObjectEdit = [self.editingMOC existingObjectWithID:myObject.objectID error:NULL];
这不应该将myObjectEdit恢复到以前的状态吗?我没有打电话给save。尽管如此,
myObjectEdit
仍保留我的更改。你知道哪里不对吗

谢谢大家!


更新:

显然,
myObjectEdit
的刷新是正确的(感谢Mark Adams)。我找到了一个奇怪的行为:

// RESET VALUE - OK
NSLog(@"%@", myEditObject);

self.tableView.userInteractionEnabled = NO;

// OLD VALUE AGAIN - WRONG
NSLog(@"%@", myEditObject);

关于
userInteractionEnabled
,我没有做任何更改。此方法是否有文档中未说明的任何副作用?

您需要将
-refreshObject:mergeChanges:
发送到您的
NSManagedObjectContext
。传入您的
NSManagedObject
子类,并将
NO
传递给
mergeChanges:
。这会将对象变回故障状态,并放弃自上次从持久性存储中获取以来所做的任何更改。在这种情况下,对象从未在存储中,因此它被完全丢弃

[self.editingMOC refreshObject:myObject mergeChanges:NO];


编辑:从您的问题来看,您可能在线程之间传递对象。在这种情况下,请确保通过objectID创建对象,而不是跨线程引用对象。我假设您已经知道这一点…

您需要将
-refreshObject:mergeChanges:
发送到您的
NSManagedObjectContext
。传入您的
NSManagedObject
子类,并将
NO
传递给
mergeChanges:
。这会将对象变回故障状态,并放弃自上次从持久性存储中获取以来所做的任何更改。在这种情况下,对象从未在存储中,因此它被完全丢弃

[self.editingMOC refreshObject:myObject mergeChanges:NO];


编辑:从您的问题来看,您可能在线程之间传递对象。在这种情况下,请确保通过objectID创建对象,而不是跨线程引用对象。我想你已经知道了…

我说的对吗?我打电话给它,它仍然不工作:[self.editingMOC reset];myObjectEdit=[self.editingMOC existingObjectWithID:myObjectId错误:NULL];[self.editingMOC refreshObject:MyObject编辑合并更改:否];发送
reset
会导致主运行中心忘记其所有对象,但不一定会使现有对象无效。如果在刷新对象后重置会发生什么情况?然后我得到:**由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因是:“ID为:…>的NSManagedObject已无效。”因此refreshObject:mergeChanges:正在执行我们预期的操作。不需要-reset消息。好的,我找到了。必须使用“moc.stalenessInterval=0.0;”禁用托管对象上下文的任何缓存。你能相应地修改你的答案吗?谢谢我是对的吗?我打电话给它,它仍然不工作:[self.editingMOC reset];myObjectEdit=[self.editingMOC existingObjectWithID:myObjectId错误:NULL];[self.editingMOC refreshObject:MyObject编辑合并更改:否];发送
reset
会导致主运行中心忘记其所有对象,但不一定会使现有对象无效。如果在刷新对象后重置会发生什么情况?然后我得到:**由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因是:“ID为:…>的NSManagedObject已无效。”因此refreshObject:mergeChanges:正在执行我们预期的操作。不需要-reset消息。好的,我找到了。必须使用“moc.stalenessInterval=0.0;”禁用托管对象上下文的任何缓存。你能相应地修改你的答案吗?谢谢