【发布时间】:2013-05-08 23:59:50
【问题描述】:
我有一个基于 NSInMemoryStoreType 存储的核心数据堆栈。而且我注意到删除对象并没有真正删除它们或使它们为零,而是只是将它们变成错误。
例如,(MyManagedObjectEntityClass 以及 标识符都是占位符):
MyManagedObjectEntityClass *o = [NSEntityDescription insertNewObjectForEntityForName:@"<MyManagedObjectEntityClass Entity Name>" inManagedObjectContext:self.localContext];
NSLog(@"\n%@", o);
[self.localContext deleteObject:o];
NSLog(@"\n%@", o);
将记录该对象仍然存在,只是它的数据是错误的。
在删除后添加[self.localContext save:nil]; 也不会改变这一点。
我希望我可以在某个时候为nil 测试o 变量,在这种情况下我会重新加载该对象 - 但似乎我不能。
以防万一,是的,我知道我可以改为测试 o 是否为 -isFault。但问题是,将此测试外推到 NSSet,我不能仅仅依靠 [[set anyObject] isFault] 来得出该集合中的所有对象都已被删除的结论(理想情况下,该集合的计数为 0,但所有对象仍然存在故障) .
所以我想知道是否有可能,或者我可以采取什么替代方法来测试对象是否已被删除,以对它们是托管对象这一事实透明。
【问题讨论】:
-
你试过用
[o isDeleted]测试吗? -
事情是让我和 isFault 处于同一条船上。对象本身会从上下文中删除。如果我在删除后执行提取请求,则上下文不返回任何匹配项。问题实际上是,对客户端代码中保存的对象的任何引用(例如,视图控制器中的 NSArray,持有一堆托管对象)在删除后仍然在集合中,即使它们是错误的,它们仍然是对象,如果我针对 nil 进行测试或测试集合的计数。
-
可能是我尝试使用托管对象的方式超出了核心数据的范围。我在想也许可以编写一个类别或对集合进行子类化以使它们了解托管对象,但这可能效率极低。
-
阅读here关于无法完成故障
-
我的问题实际上是 C 语义(按值)与您刚刚链接的核心数据的条件和行为的组合。谢谢指点! (没有双关语)