【问题标题】:Magical Record, saving, and NSFetchedResultsController神奇的记录、保存和 NSFetchedResultsController
【发布时间】:2012-06-14 00:57:24
【问题描述】:

不确定这是否是 Magical Record 保存方式的问题,或者我只是在某个地方犯了一个菜鸟错误。

我正在使用 NSFetchedResultController (FRC) 和 UITableView 来显示实体列表,当用户点击“添加”一个带有编辑器的新视图控制器时,会使用[MyEntity MR_createEntity] 创建一个新实体。用户可以在此处添加通过关系添加到主实体的其他实体。当用户在此视图控制器中点击“保存”时,上下文将使用 [[NSManagedObjectContext MR_contextForCurrentThread] MR_save] 保存

NSFetchedResultsController 似乎更新了,但是当我点击编辑实体时,没有任何子实体存在。调试似乎表明,即使实体已保存,FRC 仍然具有具有临时 ID 的实体。

我在 FRC controllerDidChangeContent 委托方法中做了一个幼稚的 [self.tableView reloadData]。

重新启动应用程序会加载正确的实体,并且子实体会在编辑器视图控制器中正确显示。

看起来 FRC 响应了“主线程”保存事件,但保存实际上发生在后台线程上,因此 FRC 看不到它。我已经检查过了,所有“我的”操作(设置 FRC、创建和获取实体)都发生在主线程上下文中。

我尝试在 MR_rootSavingContext 上侦听更改通知,并将它们与主线程上下文合并,这有点工作,但我最终在 FRC 中发现了重复行(一个是正确的“永久”实体,一个是临时实体) .

【问题讨论】:

    标签: objective-c core-data nsfetchedresultscontroller magicalrecord


    【解决方案1】:

    好的,我不确定这是否是“正确的方法”,但我发现如果我在 MR_rootSavingContext 中创建 NSFetchedResultsController 而不是使用“inContext”版本的默认上下文,它可以正常工作MR_fetchAllSortedBy.

    我想从 FRC 现在正在监视 rootSavingContext 而不是它的其中一个孩子的角度来看,这是有道理的。不过,我会认为,因为我在同一个线程上执行所有操作,这不会是一个问题。

    更新:这种方法的唯一问题是,如果我只是使用[frc objectAtIndexPath:] 抓取实体并将其提供给编辑视图控制器,则它不再处于默认上下文中。通过使用 NSManagedObjectContext 的existingObjectWithID 在默认上下文中重新获取实体来解决此问题。仍然感觉不完全正确,但它对我有用。

    【讨论】:

    【解决方案2】:

    知道这是一个旧答案,但以上都不适用于我,希望对未来的读者有所帮助

    对我来说,问题是由于尝试使用以前与 iCloud 一起使用的 sqlite 文件设置纯本地存储造成的。

    基本上,我尝试使用我的 CoreData 应用程序实现 iCloud,执行基本步骤以使用无处不在的容器等进行设置,但随后由于这似乎导致固有的不稳定性而恢复(为什么 CoreData 和 iCloud 仍然没有相处?!),但可可不喜欢你这样回溯。

    幸运的是,我没有在实时应用程序中执行此操作,因此更改相对容易,因为它只会影响开发设备,但如果您要在实时应用程序中从 iCloud 迁移到本地商店,我认为 您可能需要查看以下解决方案之一:

    Migrating a Core Data Store from iCloud to local

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2014-08-04
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多