首页 文章

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

提问于
浏览
1

我正在使用 NSFetchedResultsControllerUIManagedDocument 结合使用,后者在后台线程中更新 .

我完全按照本教程中的描述设置了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 回答

  • 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/

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

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

相关问题