【问题标题】:Reset managed object context does not work重置托管对象上下文不起作用
【发布时间】:2011-12-08 21:23:18
【问题描述】:

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

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

[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 进行任何更改。这种方法有没有文档中没有说明的副作用?

【问题讨论】:

    标签: ios uitableview core-data restore nsmanagedobjectcontext


    【解决方案1】:

    您需要将-refreshObject:mergeChanges: 发送到您的NSManagedObjectContext。传入你的NSManagedObject 子类并将NO 传递给mergeChanges:。这会将对象重新变为故障并丢弃自上次从持久存储中获取以来的所有更改。在这种情况下,该对象从未在商店中,因此被完全丢弃。

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

    NSManagedObjectContext Class Reference - refreshObject:mergeChanges:

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

    【讨论】:

    • 我猜对了吗?我称之为,它仍然无法正常工作:[self.editingMOC reset]; myObjectEdit = [self.editingMOC existingObjectWithID:myObject.objectID error:NULL]; [self.editingMOC refreshObject:myObjectEdit mergeChanges:NO];
    • 发送 reset 会导致 MOC 忘记其所有对象,但不一定会使现有对象无效。如果在刷新对象后重置会发生什么?
    • 然后我得到:*** 由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因:“ID 为 ....> 的 NSManagedObject 已失效。”
    • 所以 refreshObject:mergeChanges: 正在做我们期望的事情。 -reset 消息是不必要的。
    • 好的,我找到了。您必须使用以下命令禁用托管对象上下文的任何缓存:“moc.stalenessInterval = 0.0;”。您可以相应地编辑您的答案吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多