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

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

我愿意:

[NSFetchedResultsController deleteCacheWithName:nil];

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

【问题讨论】:

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

标签: iphone cocoa-touch core-data nsfetchedresultscontroller


【解决方案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];

【讨论】:

  • 行得通!我做了很多保存,所以没有实现通知,因为在我的情况下它似乎有很多不必要的开销,但解决方案非常有效!
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2023-03-07
  • 2018-01-11
  • 2012-04-23
  • 2018-08-16
相关资源
最近更新 更多