Core Data 似乎没有采用更新的值

Posted

技术标签:

【中文标题】Core Data 似乎没有采用更新的值【英文标题】:Core Data does not seem to take updated values 【发布时间】:2011-03-02 20:52:57 【问题描述】:

我正在运行一个使用 coredata 更新表的更新线程。 其中一条记录称为上次更新。但是当更新完成后,我在主线程中检索上次更新的值时,我得到了一个过时的值。

我愿意:

[NSFetchedResultsController deleteCacheWithName:nil];

在再次查询设置之前,我应该/可以做些什么来提醒主线程它应该再次检查物理表?

【问题讨论】:

您的更新线程是否对您的提取线程使用单独的托管对象上下文? 按照建议这样做,这是唯一的线程保存方式。我可以重新编写整个应用程序以在主线程上执行核心数据调用,但这有点使设计不合逻辑。一定有办法??? 您不需要重写或重构应用程序 - 但您需要在工作线程和主线程中拥有 NSManagedObjectContexts,它们都指向同一个 NSPersistentStoreCoordinator。查看 Marcus Zarra 的核心数据一书 - 特别是第 9 章(多线程和核心数据) - 了解有关跨线程通信的详细信息(他的意思是让工作线程通知主线程更改)。 @Westsider--您应该将评论移至答案。 谢谢,听起来不错,我会去看看这本书!谢谢! 【参考方案1】:

听起来您没有将更新同步回主线程的 NSManagedObjectController。尝试添加这样的方法:

- (void)managedContextDidSave:(NSNotification *)n 
    if ([NSThread isMainThread]) 
        NSManagedObjectContext *context = /* Get context for main thread */;
        [context mergeChangesFromContextDidSaveNotification:n];
     else 
        [self performSelectorOnMainThread:@selector(managedContextDidSave:) withObject:n waitUntilDone:YES];
    

然后将其连接到NSManagedObjectContextDidSaveNotification:

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

【讨论】:

行得通!我做了很多保存,所以没有实现通知,因为在我的情况下它似乎有很多不必要的开销,但解决方案非常有效!

以上是关于Core Data 似乎没有采用更新的值的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序运行时替换 Core Data sqlite 文件,数据不更新

Swift Core Data NSFetchRequest 没有结果

Core Data 自定义访问器甚至没有被调用

使用 Swift 和 XCode 在 Core Data 中存储整数

无需更改屏幕即可更新 Core Data

如何使用 Core Data 更新数据?