我正在使用 NSFetchedResultsController
与 UIManagedDocument
结合使用,后者在后台线程中更新 .
我完全按照本教程中的描述设置了NSFetchedResultsController:How To Use NSFetchedResultsController
我已将委托 _fetchedResultsController.delegate = self
和我的视图控制器的协议设置为 NSFetchedResultsControllerDelegate
.
启动后加载数据时,我的代码工作正常 . 但是, NSFetchedResultsController
does not update the TableView 只要它处理并保存后台线程中的数据 . 特别是,永远不会调用NSFetchedResultsController的委托方法 -controllerWillChangeContent:controller
等 .
我仔细检查过SQLite数据库是否包含正确的数据 . 这是我在视图控制器中处理和保存数据的方法:
[backgroundContext performBlock:^{
[company parseAttributesFrom:xmlStr inManagedObjectContext:backgroundContext]; //self.managedDocument.managedObjectContext
NSError *error = nil;
[backgroundContext save:&error];
if (error) NSLog(@"error: %@",error.localizedDescription);
[self.managedDocument.managedObjectContext performBlock:^{
NSError *error = nil;
[self.managedDocument.managedObjectContext save:&error];
if (error) NSLog(@"error: %@",error.localizedDescription);
}];
[self.managedDocument saveToURL:self.managedDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
[self.managedDocument updateChangeCount:UIDocumentChangeDone];
}];
当底层数据发生变化时,如何让NSFetchedResultsController自动更新TableView?
谢谢您的帮助!
2 回答
我认为原因在于managedObjectContext . 您在后台进行更改,并从主要内容中进行
NSFetchedResultsController
提取 . 因此,您需要通过添加上下文中的更改观察器来将更改合并到该上下文这是Marcus Zarra的伟大教程 - 核心数据的大师)希望有所帮助 . http://www.cimgf.com/2011/08/22/importing-and-displaying-large-data-sets-in-core-data/
在使用UIManagedDocument时,我建议您将后台上下文作为主上下文的子项 .
现在,您可以在后台上下文中执行所需操作,并且当您想要保存背景上下文时,更改将填充到主上下文中 . 当然,您仍然需要保存UIManagedDocument,但是通过设置ChangeDone计数,可以在后台再次“无缝地”完成 .
现在,您的背景上下文消失了,您的主要上下文会看到更改,并保存文档 .