在UIManagedDocuments获取新数据后,NSFetchedResultsController不会更新TableView

我正在使用一个NSFetchedResultsController与在后台线程中得到更新的UIManagedDocument组合。

我已经完全按照本教程中的描述设置了NSFetchedResultsController: 如何使用NSFetchedResultsController

我已经把委托_fetchedResultsController.delegate = self和我的视图控制器的协议设置_fetchedResultsController.delegate = self

我的代码在启动后加载数据时工作正常。 但是, NSFetchedResultsController 不会更新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?

感谢您的帮助!

我认为这是在managedObjectContext中的原因。 你在后台进行更改,并NSFetchedResultsController从主要提取。 因此,您需要通过在上下文中添加观察者来将更改合并到该上下文中

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil]; 

这是Marcus Zarra的一个很好的教程 – 核心数据的大师)希望有帮助。 http://www.cimgf.com/2011/08/22/importing-and-displaying-large-data-sets-in-core-data/

在使用UIManagedDocument时,我会build议您将背景上下文设置为主要上下文的子项。

 backgroundContext = [[NSManagedContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; backgroundContext.parent = self.managedDocument.managedObjectContext; 

现在,你可以在后台上下文中做你想做的事情,而当你想保存后台上下文时,这些变化将被塞进主要的上下文中。 当然,您仍然需要保存UIManagedDocument,但是通过设置ChangeDone计数,可以在后台“无缝地”完成。

 [backgroundContext performBlock:^{ [company parseAttributesFrom:xmlStr inManagedObjectContext:backgroundContext]; //self.managedDocument.managedObjectContext NSError *error = nil; [backgroundContext save:&error]; if (error) NSLog(@"error: %@",error.localizedDescription); // NOTE: Now, the changes have been pushed into the main context of your document. // DO NOT call save directly on the managed document context. [self.managedDocument.managedObjectContext performBlock:^{ [self.managedDocument updateChangeCount:UIDocumentChangeDone]; }]; }]; 

现在,您的背景环境就会消失,您的主要上下文将看到更改,并保存文档。