objective-c - 已删除 NSManagedObject 从 TableView 中正确删除,然后在保存时重新出现

标签 objective-c ios core-data nsfetchedresultscontroller nsmanagedobjectcontext

我正在使用 NSFetchedResultsController 和 NSFetchedResultsControllerDelegate 来驱动 UITableViewController/UITableView。单击按钮会触发通过 [managedObjectContext deleteObject:aManagedObject] 删除 NSManagedObject。

NSFetchedResultsControllerDelegate 方法正确触发,该行从 UITableView 中删除。

这就是事情变得奇怪的地方。当我调用 [managedObjectContext save:&error] 时,NSFetchedResultsControllerDelegate 方法 controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 以删除的 NSManagedObject 作为对象调用(并且 isDeleted 是 YES在托管对象上)并且更改类型是 NSFetchedResultsChangeInsert,它将删除的 NSManagedObject 添加回 UITableView。

我试图通过检查委托(delegate)方法中的 isDeleted 标志来禁止插入,但这会导致 beginUpdatesendUpdates 断言失败。

我做错了什么或出了问题吗?我是否错过了某处步骤?

最佳答案

面对与您完全相同的问题,我可以意识到只有另一个对象或上下文对已删除对象的单个引用才能使它作为故障保持事件状态,直到引用被删除。如果应用程序再次尝试访问已删除的对象,它将崩溃。单个引用可能是已删除对象重新出现的原因。

在我的案例中,在调用异步删除操作之前释放对将要删除的对象的 UIViewController 实例引用解决了这个问题。

// Delete a NSManagedObject.
NSManagedObjectID *objectID = [[managedObject objectID] copy];
// Release all references to the object.
self.managedObject = Nil;
// Asynchronously delete the object.
[self asynchronouslyDeleteManagedObjectWithManagedObjectID:objectID];

忽略 Release all references to the object 部分会使对象在被删除到 NSFetchedResultsController 观察者实例后重新出现为 isDeleted

关于objective-c - 已删除 NSManagedObject 从 TableView 中正确删除,然后在保存时重新出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910217/

相关文章:

ios - 如何在 iOS 中创建流体图形动画

ios - 挂起(卡住)问题 UISemanticContentAttribute = .ForceRightToLeft

ios - 将 SQL 存储添加到 NSPersistentStoreCoordinator 时如何调试/处理间歇性 "authorization denied"和 "disk i/o"错误?

Objective-C/iOS : How to remove 'values' from an attribute in CoreData?

ios - UILabel 问题的 UITapGesture 选择器

objective-c - 在 cocoa 中使用绑定(bind)时,更改未反射(reflect)在 View 中

ios - 尝试从多个实体中获取记录

iphone - ManagedObjectContext 保存导致 NSManagedObject 数据损坏/失效

ios - 在 UIButton 单击上添加多个 UITextField

ios - 如何在 Xcode 4.3 iOS 中更改文件扩展名?