2017-05-29 43 views
0

我在初始屏幕上为NSManaged对象创建NSFetchRequest。我有时在一个场景中崩溃的时候我:从核心数据中删除对象并切换视图控制器时发生崩溃

  • 切换到另一个视图控制器我的标签栏控制器内
  • 再拍提取具有相同管理目标类型
  • 删除一个共同的管理对象也要求出现在我最初的VC的fetchrequest中。 VC包含一个表格视图。
  • 拨动保存管理方面的第一个VC,并重新加载,我不使用NSFetchResutltsController管理这些返回的对象中的数据

。崩溃发生在我的tableview重新加载时。我做了另一个请求,并期望被删除的对象不被返回,但它确实。当我的单元格试图读取已删除对象的属性时,它会读取uninitialized并崩溃。在两个VC之间切换时,这大概会发生在5次中的1次。我在我的所有CoreData函数中都使用了performAndWait

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

+0

什么是崩溃消息和它崩溃的代码行? – Paulw11

+0

可以在这里添加崩溃日志... –

回答

1

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

有两种可能的解决方案,你在你的问题中暗示了。您可以将值从managedObject复制出来,也可以使用fetchedResultsController。如果您复制这些值,那么即使在删除实体后,它也会显示为正常。如果使用fetchedResultsController,则fetchedObjects属性将永远不会包含已删除的对象,并且该对象在删除后将不可访问。

我会推荐使用fetchedResultsController。你不需要害怕它。这不是一个很大的开销,即使只提取一个对象也是合理的。

+0

感谢您的详细解答Jon。我将在两个屏幕之间实现fetchResultsController。 – yamski

相关问题