ios - 从核心数据中删除对象并切换 View Controller 时崩溃

标签 ios uitableview core-data nsfetchrequest

我正在初始屏幕上为 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/

相关文章:

ios - 如何检查 SpriteKit 中屏幕的两半是否有触摸?

ios - 字典无法识别键类型

ios - 如何从 json 响应创建动态节头

ios - 在 UISearchDisplayController 中检测对 "no displayed search results"的点击

iOS - 如果找到匹配则更新托管对象

ios - UITextView 的背景图片

objective-c - 编辑模式下的Uitableview : how to add both the "+" (add) and "-" (delete) buttons at the same time?

ios - 如何知道是否使用 MGSwipeTableCell 删除了所有单元格

iphone - 无法将数据从 Data sqlite 预加载到我的核心数据

ios - 重新排列 UITableView 中的行;保存到核心数据