我正在初始屏幕上为 NSManaged 对象创建 NSFetchRequest。有时我会在以下情况下发生崩溃:
- 切换到标签栏 Controller 中的另一个 View Controller
- 使用相同的托管对象类型发出另一个提取请求
- 删除一个常见的托管对象,该对象也出现在我最初的 VC 的 fetchrequest 中。 VC 包含一个 TableView 。
- 保存托管上下文
- 切换到第一个 VC,并重新加载数据
我没有使用 NSFetchResutltsController 来管理这些返回的对象。当我的表格 View 重新加载时发生崩溃。我确实提出了另一个请求,并希望不会返回已删除的对象,但它确实返回了。当我的单元尝试读取已删除对象的属性时,它会读取“未初始化”并崩溃。在 2 个 VC 之间切换时,这种情况大约发生五分之一。我在所有 CoreData 函数中使用 performAndWait
。
有没有办法解耦两个屏幕之间的托管对象的关系?如果不是,我怎样才能在第一个 VC 中获取获取请求,而不返回在第二个 VC 中删除的对象,并保持它们同步?
最佳答案
NSManagedObject 与其他对象不同。它本身不包含任何信息。它有一个指向其上下文的指针和一个 objectID。当您访问它的属性时,它会将请求转发到上下文以获取所需的信息。因此,当从上下文中删除实体时,受管对象将停止工作并导致崩溃。这就是为什么总的来说,我认为永远保留指向 managedObject 的指针并始终使用 fetchedResultsController 访问它们是一种不好的做法,即使仅针对一个对象,并且仅在 managedObjects 结果随后被丢弃时才进行提取。
您在问题中暗示了两种可能的解决方案。您可以从 managedObject 中复制值,也可以使用 fetchedResultsController。如果您复制这些值,那么即使在实体被删除后它也会正常显示。如果您使用 fetchedResultsController,则 fetchedObjects 属性将永远不会包含已删除的对象,并且该对象在删除后将无法访问。
我建议使用 fetchedResultsController。你不需要害怕它。这并不是很大的开销,即使您只获取一个对象,使用它也是合理的。
关于ios - 从核心数据中删除对象并切换 View Controller 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44234500/