1

我将 a与在后台线程中更新的aNSFetchedResultsController结合使用。UIManagedDocument

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

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

我的代码在启动后加载数据时工作正常。但是,只要在后台线程中处理并保存了数据,它就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?

感谢您的帮助!

4

2 回答 2

2

我认为原因在于 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/

于 2012-06-25T16:12:38.850 回答
1

我建议,在使用 UIManagedDocument 时,将背景上下文设为主上下文的子上下文。

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];
    }];
}];

现在,您的背景上下文消失了,您的主要上下文看到了更改,并且保存了文档。

于 2012-06-25T22:58:05.320 回答