Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从核心数据中删除对象并切换视图控制器时崩溃_Ios_Uitableview_Core Data_Nsfetchrequest - Fatal编程技术网

Ios 从核心数据中删除对象并切换视图控制器时崩溃

Ios 从核心数据中删除对象并切换视图控制器时崩溃,ios,uitableview,core-data,nsfetchrequest,Ios,Uitableview,Core Data,Nsfetchrequest,我在初始屏幕上对NSManaged对象发出NSFetch请求。我有时会在以下情况下崩溃: 切换到“我的选项卡栏”控制器中的其他视图控制器 使用相同的托管对象类型发出另一个获取请求 删除一个常见的托管对象,它也出现在我最初的VC的fetchrequest中。VC包含一个表视图 保存托管上下文 切换到第一个VC,然后重新加载数据 我没有使用NSFetchResultsController来管理这些返回的对象。当我的tableview重新加载时发生崩溃。我确实发出了另一个请求,并希望删除的对象不会

我在初始屏幕上对NSManaged对象发出NSFetch请求。我有时会在以下情况下崩溃:

  • 切换到“我的选项卡栏”控制器中的其他视图控制器
  • 使用相同的托管对象类型发出另一个获取请求
  • 删除一个常见的托管对象,它也出现在我最初的VC的fetchrequest中。VC包含一个表视图
  • 保存托管上下文
  • 切换到第一个VC,然后重新加载数据
我没有使用NSFetchResultsController来管理这些返回的对象。当我的tableview重新加载时发生崩溃。我确实发出了另一个请求,并希望删除的对象不会返回,但它确实返回了。当我的单元格试图读取已删除对象的属性时,它会读取未初始化的
,然后崩溃。在两个VCs之间切换时,这种情况大约发生5次中的1次。我在所有CoreData函数中都使用了
performAndWait


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

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

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


我建议使用fetchedResultsController。你不必害怕它。这不是很大的开销,即使只获取一个对象,也可以合理地使用它

什么是崩溃消息?它崩溃在哪一行代码上?你能在这里添加崩溃日志吗?谢谢你的详细回答Jon。我将在两个屏幕之间实现fetchResultsController。