从Core Data中删除对象并切换视图控制器时崩溃

时间:2017-05-29 04:13:32

标签: ios uitableview core-data nsfetchrequest

我在初始屏幕上为NSManaged Object创建NSFetchRequest。我有时会遇到崩溃:

  • 切换到我的标签栏控制器中的另一个视图控制器
  • 使用相同的托管对象类型生成另一个获取请求
  • 删除一个常见的托管对象,这些对象也出现在我最初的VC的fetchrequest中。 VC包含表格视图。
  • 保存托管上下文
  • 切换到第一个VC,然后重新加载数据

我没有使用NSFetchResutltsController来管理这些返回的对象。当我的tableview重新加载时发生崩溃。我确实发出了另一个请求,并期望不会返回已删除的对象,但确实如此。当我的单元格尝试读取已删除对象的属性时,它会读取uninitialized并崩溃。当在2个VC之间切换时,这种情况大约发生在5次中。我在所有CoreData函数中使用performAndWait

有没有办法在两个屏幕之间解耦托管对象的关系?如果没有,我如何在第一个VC中获取我的获取请求,而不是返回在第二个VC中删除的对象,使它们保持同步?

1 个答案:

答案 0 :(得分:1)

NSManagedObject与其他其他对象不同。它本身不包含任何信息。它有一个指向其上下文和objectID的指针。当您访问它的属性时,它会将请求转发到上下文以获取所需的信息。因此,当从上下文中删除实体时,managedObject会停止工作并导致崩溃。这就是为什么我认为永远保持指向托管对象的指针是一种不好的做法,并且即使只针对一个对象,也始终使用fetchedResultsController访问它们,并且只有在托管对象结果之后才丢弃时才进行提取。

您可以在问题中暗示有两种可能的解决方案。您可以将值复制到managedObject之外,也可以使用fetchedResultsController。如果复制值,则即使删除实体后它也会正常显示。如果使用fetchedResultsController,则fetchedObjects属性将永远不会包含已删除的对象,并且该对象在删除后将无法访问。

我建议使用fetchedResultsController。你不需要害怕它。它不是一个很大的开销,即使您只获取一个对象也可以使用它。