我的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");
}
答案 0 :(得分:0)
首先,视图控制器应该使用由app delegate创建的托管对象上下文(对于主线程)。如果app委托正在进行一些重要的数据加载,那么应该专门为此目的和后台线程创建另一个托管对象上下文。
如果可以,您的视图控制器应使用NSFetchedResultsController
从托管对象上下文中获取数据。它提供了一种简单的机制,只获取需要显示的数据和(如果您使视图控制器成为FRC委托),它还将监视对托管对象上下文的更改,并告诉您何时需要重新加载表视图。
如果您无法使用NSFetchedResultsController
,那么您的通知方法应该可以正常使用。您在上面显示的代码将添加self
(我假设是视图控制器)作为观察者。您应该在加载视图时执行此操作,然后在需要重新加载表视图时调用handleDidSaveNotification:
。记得在卸载视图和取消分配视图控制器时将自己移除为观察者。
根据你的评论,你说:
我使用NSFetchedResultsController并将此数据加载到填充表
的数组中
不要这样做......使用NSFetchedResultsController
获取数据,但不要将其复制到数组中 - 这会破坏NSFetchedResultsController
的大部分好处。代替:
让自己成为NSFetchedResultsController
和controllerDidChangeContent:
中[self.tableView reloadData];
所需的代表。
在表格视图委托方法tableView:cellForRowAtIndexPath:
中,使用NSFetchedResultsController
获取其数据将使用objectAtIndexPath:
在单元格上显示的对象。
请阅读Ray Wenderlich NSFetchedResultsController
指南here。