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 没有结果