gpt4 book ai didi

ios - 从内存存储中删除 Core Data 对象会使它们变成错误,但不会删除它们

转载 作者:行者123 更新时间:2023-11-29 03:56:18 24 4
gpt4 key购买 nike

我有一个基于 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]; 也不会改变这一点。

我希望我可以在某个时候测试 o 变量是否为 nil,在这种情况下我会重新加载该对象 - 但似乎我不能。

以防万一,是的,我知道我可以测试 o-isFault。但事实是,将此测试推断为 NSSet,我不能仅仅依靠 [[set anyObject] isFault] 来得出该集合中的所有对象都已被删除的结论(理想情况下该集合的计数是0,但所有对象仍然存在错误)。

所以我想知道是否有可能,或者我可以采取什么替代方法来测试对象是否已被删除,而这些对象是托管对象这一事实是透明的。

最佳答案

这实际上不是核心数据问题。 C(以及扩展的 Objective-C)不是这样工作的。

deleteObject: 方法采用一个参数,即指向对象的指针。它可以更改对象(例如设置其 isDeleted 标志),也可以执行与该对象相关的其他操作(例如从其托管对象上下文中删除它)。它不能改变指针本身的值。因此,无论它做什么或应该做什么,C 都会说,一旦完成,您传入的指针仍然指向内存中的同一位置。因此,在这种语言中,该方法实际上不可能强制该指针为零。如果你希望它为零,你必须自己改变它。 (顺便说一句,可以实现该方法来获取指向指针参数的指针,这可以修改您的指针。但这对其他引用(例如数组中的引用)没有影响,所以这有点毫无意义)。

这就是为什么 isDeleted 方法是公共(public)的,这样如果您在其他位置有指向该对象的指针,您可以在尝试使用它之前检查它是否已被删除。

如果这还不够方便(而且通常不够方便),Core Data 还提供了 NSManagedObjectContextObjectsDidChangeNotificationNSManagedObjectContextDidSaveNotification。您可以在应用程序中的任何位置使用它们来获取上下文更改的通知,并以任何适当的方式进行响应(例如更新数组)。这些通知都试图通过提供插入、更新和删除对象的列表来帮助您。尽可能使用这些来检查您是否确实需要更新您的引用资料。

关于ios - 从内存存储中删除 Core Data 对象会使它们变成错误,但不会删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com