2

我有一个应用程序,我将核心数据与 iCloud 集成在一起。我的视图控制器中有以下通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadFetchedResults:) name:NSPersistentStoreCoordinatorStoresDidChangeNotification object:coreDataController.psc];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadFetchedResults:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:coreDataController.psc];

视图控制器包含一个UITableView使用NSFetchedResultsController. 我不确定在以下方法(由上面的通知调用)中放入什么来刷新表格。我曾尝试重新加载表并重新获取数据,但无济于事。我知道 iCloud 正在完成它的工作,因为如果我完全重新加载视图控制器,更改的数据就会显示出来。

- (void)reloadFetchedResults:(NSNotification*)note {
    NSLog(@"Underlying data changed ... refreshing!");

    //_fetchedResultsController=nil;
    //[self fetchedResultsController];

    [theTableView reloadData];


}

任何帮助将不胜感激,谢谢!

4

2 回答 2

4

您是否需要获取另一组数据,或者您是否希望查看对同一结果集的更改?如果是前者,则将其拆除并使用新的谓词、获取等重建。然后执行获取。

如果是后者,您需要将您的更改与您的 moc 合并。当您注册通知时,请按如下方式进行设置:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentContentsImportedChanges:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:self.managedObjectContext.persistentStoreCoordinator];


- (void) documentContentsImportedChanges:(NSNotification*)notification
{
    // Received updates from iCloud
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
于 2013-05-13T10:13:21.730 回答
2

我同意杰森的回答。但是,您应该确保在正确的线程中执行更新。

[[NSNotificationCenter defaultCenter] addObserver:self
               selector:@selector(persistentStoreDidImportUbiquitousContentChanges:)
                   name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
                 object:_persistentStoreCoordinator];

- (void)persistentStoreDidImportUbiquitousContentChanges:(NSNotification*)note
{
    NSManagedObjectContext *moc = self.managedObjectContext;
    [moc performBlock:^{
        [moc mergeChangesFromContextDidSaveNotification:note];

    }];
}

这种更新 MOC 的方法确保它在与上下文相同的线程中完成,因此您不会发生任何崩溃;)

于 2014-05-15T13:10:28.150 回答