我有一个问题,如果我对核心数据对象进行更改,保存然后刷新该对象,将导致我的NSFetchedResultsController显示一个重复的对象。我想我理解发生了什么,但我正在寻找一个人来确认,并希望给出一些更多的细节,为什么。
为了更好地解释,我有两个实体,Fixture和Position。Fixture有许多Positions,而Position只属于一个Fixture。为了复制这一问题,我做了以下工作:
foo.fixture.name = "foobar"context.refreshAllObjects或context.refreshObject(foo, mergeChanges: false/true)刷新对象。我有一个表视图,它使用一个获取的结果控制器来显示补丁。完成上述操作后,tableview将显示每个项的重复项(不管我是使用FRC的委托方法进行更新,还是只是重新加载表视图)。
看起来,刷新使FRC所知道的对象无效,同时获取另一组对象的知识。如果,作为步骤5,我调用了frc.performFetch(),那么问题就消失了。
其他要注意的事项:
Fixture子类上调用。为了提供更多的上下文,说明我最初是如何进入这种情况的,用户可以单击列表中的一个夹具,然后在几个屏幕上最终缩小到一个位置,在那里他们可以执行修改夹具的操作。此时,应用程序中还有其他活动区域正在监听NSManagedObjectContextDidSaveNotification,我希望它们更新它们的对象,以便它们能够显示正确的数据,这就是为什么我要调用refresh。
我在文档中仔细研究过,我看不到任何具体解释我的理论的东西,即更新上下文会导致NSFetchedResultsController具有无效的对象。有人能对这种行为有所了解吗?
发布于 2016-04-23 16:39:50
首先,really不应该在NSManagedObject上覆盖-init...。这是一种非常不鼓励重写的方法,可以很容易地成为问题的来源。
其次,整个UI应该使用一个与主队列相关联的NSManagedObjectContext实例,因此您的UI中任何特定实体的都应该只有一个实例。如果您有多个上下文,那么您只会使事情变得更加复杂。如果您使用的是单个上下文,请记住,无论您针对该上下文获取对象多少次,都会得到完全相同的指针。
NSFetchedResultsController永远不会创建对象,它只获取并提供它们以供显示。因此,NSFetchedResultsController只报告您在代码中的其他地方创建了此复制的事实。
现在有一些问题,这些副本会被推到磁盘上吗?
你能在磁盘上的存储文件中看到它们吗?
当您重新启动您的应用程序时,副本还在吗?
当您在自定义-init方法中放置打印到NSManagedObject上时,它们会不止一次触发吗?
https://stackoverflow.com/questions/36807525
复制相似问题