NSFetchedResultsController重复的行

时间:2011-06-08 11:48:08

标签: objective-c core-data nsfetchedresultscontroller rows

当使用辅助线程刷新NSFetchedResultsController内容时,我遇到了一种奇怪的行为,我想知道这是一个常见问题,或者我可能做错了。

我有一个集中式NSManagedObjectContext驻留在我的主委托对象中,由所有视图控制器使用和共享。通过执行fetch并调用其委托方法加载表后,将在后台启动辅助线程以更新其结果。但是,只有在奇怪的场合,当插入新条目时,它们才会在表格视图中重复出现。如果我退出并重新进入,重复的行会消失,这使得认为它们只存在于托管对象上下文中。

以下是以下步骤:

  1. 后台NSOperation线程创建链接到主应用程序委托的同一持久存储的受限上下文。
  2. 新线程开始侦听NSManagedObjectContextDidSaveNotification通知。
  3. 新行将被删除,更新或插入辅助上下文,在达到某个批量大小时始终进行保存调用。
  4. 在后台保存时,通知方法调用主线程上的集中上下文mergeChangesFromContextDidSaveNotification选择器,如下所示。

    -(void)mergeChanges:(NSNotification *)notification
    {
        NSManagedObjectContext *mainContext = [[appDelegate sharedDelegate] managedObjectContext];
    
        [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                                      withObject:notification 
                                   waitUntilDone:NO];
    }
    
  5. 完成操作后,将删除侦听器并释放辅助上下文。

  6. 有没有人知道造成我的表格视图行重复的原因是什么,以及如何解决这个问题?

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您无法在托管对象上下文中实际拥有“重复”对象,因为上下文中的每个对象都必须是唯一的。维护唯一对象是上下文的核心功能,因此它不会发生。所以,你有两个条件之一:

  1. 您正在创建两个或多个具有相同属性的托管对象,以便在分类到tableview时它们一起显示。
  2. 在某些情况下,您的tableview数据源逻辑实际上会将来自同一托管对象的数据两次返回到tableview。这会产生上下文中存在重复的托管对象的错觉。
  3. 我认为后者更有可能。