我在 UI 线程中有一个主要的托管对象上下文 (MOC),它通常由工作线程更新。工作正常!
但是,我有一个 View ,我在 UI 线程中创建了另一个 MOC(称为 editingMOC)。我在 editingMOC 中通过 objectID 读取了 myObject。然后我在 editingMOC 中对对象 myObject
做了一些修改。如果用户点击取消
,会发生以下情况:
[self.editingMOC reset];
myObjectEdit = [self.editingMOC existingObjectWithID:myObject.objectID error:NULL];
不应该将 myObjectEdit
恢复到它之前的状态吗?我没有调用保存。尽管如此,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];
NSManagedObjectContext Class Reference - refreshObject:mergeChanges:
编辑:从您的问题看来,您可能正在线程之间传递对象。在那种情况下,一定要通过 objectID 创建对象,而不是跨线程引用对象。我假设您已经知道这一点...
关于ios - 重置托管对象上下文不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437875/