ios - 重置托管对象上下文不起作用

标签 ios uitableview core-data restore nsmanagedobjectcontext

我在 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/

相关文章:

ios - 执行许多地理编码请求的策略

ios - 与 iOS 联系人集成

ios - View Controller 之间的 Swift 传输数据保持为空

ios - 如何使用关联数组数据源填充表头? swift XCode 6.4

php - 如何通过 JSON 在 TableView 中按 ID 显示数据

objective-c - 在 iOS 中使用单独的 View Controller 支持两个方向

android - 平板电脑操作系统的低级文本引擎

ios - 我应该如何命名可导入的 .sqlite 持久存储?

iphone - 主队列上的 dispatch_sync 和 executeFetchRequest 之间的死锁 :error:

ios - 文本字段值未及时更新以保存 textFieldDidEndEditing