检测来自不同类的app委托中NSManagedObjectContext的更改?

时间:2013-05-19 15:23:28

标签: ios objective-c core-data ios6 appdelegate

我的NSManagedObjectContext中有app delegate,数据已加载并保存正常。我还从主视图控制器调用NSManagedObjectContext并在那里加载数据。但是我有问题,因为新数据保存到NSManagedObjectContext我不知道如何在主视图控制器中检测更改和重新加载表。我猜我可以使用NSNotification,但是可以在app delegate中的NSNotification的主视图控制器中使用NSManagedObjectContext吗?

我尝试实现此代码,其中context是来自app delegate的NSManagedObjectContext(这显然不起作用)。关于如何检测数据变化的任何建议?

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

根据你的评论,你说:

  

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

的数组中

不要这样做......使用NSFetchedResultsController获取数据,但不要将其复制到数组中 - 这会破坏NSFetchedResultsController的大部分好处。代替:

  1. 让自己成为NSFetchedResultsControllercontrollerDidChangeContent:[self.tableView reloadData];所需的代表。

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

  3. 请阅读Ray Wenderlich NSFetchedResultsController指南here

相关问题