如何在不通知NSFetchedResultsController的情况下更新NSManagedObject或NSManagedObjectContext

时间:2013-12-27 14:25:42

标签: ios cocoa-touch core-data nsfetchedresultscontroller

我有一个托管对象上下文,其中有几个NSFetchedResultsController在我的应用程序中监听不同的实体,大部分时间都是完美的。

我对如何解决以下场景感到茫然:我在用户单击实体的相应表格视图单元格中的按钮时在实体上设置关系。这当前导致实体更改,FRC告诉tableview重绘整个单元格,使该按钮处于默认的控制状态。

有没有办法在没有被我的某个FRC注意的情况下更改实体?

我希望能够仅对特定更新(由我自己控制,例如设置或删除关系)产生此效果,与禁用整个FRC一段时间相比,以免失去其他更新的功能这可能会在同一时间发生。

谢谢!

2 个答案:

答案 0 :(得分:2)

可以使用“原始访问者”方法

[object setPrimitiveValue:... forKey:...]

因为这不会导致任何更改通知。但这可能有所不必要 副作用。

更好的解决方案可能是将按钮状态存储在(瞬态) 对象的属性,以便您可以在单元格时正确还原它 正在重新绘制。

答案 1 :(得分:1)

也许我不明白你的问题但是如果你想要禁用NSFetchedResultsController委托并因此删除渲染,正如我评论的那样,你可以为此使用bool值。

这里基本的想法。在这里,stopAutomaticTrackingOfChanges将是公开的,而beganUpdates可以在类扩展中维护。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    if (!self.stopAutomaticTrackingOfChanges) {
        [self.tableView beginUpdates];
        self.beganUpdates = YES;
    }
}

- (void)controller:(NSFetchedResultsController *)controller
  didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex
     forChangeType:(NSFetchedResultsChangeType)type
{
    if (!self.stopAutomaticTrackingOfChanges)
    {
        switch(type)
        {
            // your code here
        }
    }
}    

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    if (!self.stopAutomaticTrackingOfChanges)
    {
        switch(type)
        {
            // your code here
        }
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    if (self.beganUpdates) [self.tableView endUpdates];
}

这一想法来自斯坦福课程的CoreDataTableViewController.h / .m代码(参考http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2011-fall)。