0

我有一个NSManagedObjectContextapp delegate数据被加载并保存得很好。我也NSManagedObjectContext从主视图控制器调用并在那里加载数据。但是我有一个问题,因为当新数据保存到NSManagedObjectContext我不知道如何在主视图控制器中检测更改和重新加载表时。我猜我可以使用NSNotification,但是否可以NSNotification在主视图控制器NSManagedObjectContext中使用应用程序委托?

我尝试在上下文NSManagedObjectContext来自应用程序委托的情况下实现此代码(这显然不起作用)。关于如何检测数据变化的任何建议?

[NSNotificationCenter defaultCenter]
     addObserver:self
        selector:@selector(handleDidSaveNotification:)
            name:NSManagedObjectContextDidSaveNotification
          object:context];

    if (![context save:&error]) {

        NSLog(@"there is a change");
    }
4

1 回答 1

0

首先,视图控制器应该使用由应用程序委托(用于主线程)创建的托管对象上下文。如果应用程序委托正在进行一些重要的数据加载,那么应该专门为此目的并在后台线程上创建另一个托管对象上下文。

如果可以,您的视图控制器应该使用NSFetchedResultsController从托管对象上下文中获取数据。它提供了一种简单的机制来仅获取需要显示的数据,并且(如果您将视图控制器设置为 FRC 委托)它还将监视托管对象上下文的更改并告诉您何时需要重新加载表视图。

如果您不能使用 a NSFetchedResultsController,那么您的通知方法应该可以正常工作。您在上面显示的代码将添加self(我假设是视图控制器)作为观察者。您应该在加载视图时执行此操作,然后handleDidSaveNotification:在需要重新加载表视图时调用。当视图被卸载和视图控制器被释放时,请记住将自己作为观察者移除。

从您的评论中,您说:

我使用 NSFetchedResultsController 并将此数据加载到填充表的数组中

不要那样做...使用NSFetchedResultsController获取数据,但不要将其复制到数组中 - 这会破坏NSFetchedResultsController. 反而:

  1. 让自己成为 the 的代表,NSFetchedResultsControllercontrollerDidChangeContent:你只需要[self.tableView reloadData];.

  2. 在您的表格视图委托方法tableView:cellForRowAtIndexPath:中,使用NSFetchedResultsController获取其数据将显示在单元格上的对象objectAtIndexPath:

请在此处阅读 Ray WenderlichNSFetchedResultsController指南。

于 2013-05-19T15:32:20.130 回答