我在UI线程中有一个主要的托管对象上下文(MOC),它通常由工作线程更新。工作正常!
但是,我有一个视图,我在UI线程中创建另一个MOC(称为editingMOC)。我在editingMOC中通过objectID读取myObject。之后,我对editingMOC中的对象myObject
进行了一些修改。如果用户点击cancel
,则会发生以下情况:
[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
有关的任何内容。这种方法是否有任何未在文档中声明的副作用?
答案 0 :(得分:1)
您需要将-refreshObject:mergeChanges:
发送到NSManagedObjectContext
。传入NSManagedObject
子类并将NO
传递给mergeChanges:
。这会将对象重新变为故障并丢弃自上次从持久性存储中获取的任何更改。在这种情况下,对象从未进入商店,因此完全被丢弃。
[self.editingMOC refreshObject:myObject mergeChanges:NO];
NSManagedObjectContext Class Reference - refreshObject:mergeChanges:
编辑 :您的问题似乎是您可能在线程之间传递对象。在这种情况下,请确保通过objectID创建对象,而不是跨线程引用对象。我假设你已经知道了这一点......