【问题标题】:Core Data and NSFetchedResultsController: how to retrieve a managed object核心数据和 NSFetchedResultsController:如何检索托管对象
【发布时间】:2014-03-10 00:51:02
【问题描述】:

问题:

我正在阅读 Tim Roadley 的“Learning Core Data of iOS”。我不明白为什么作者在从 fetched results controller 检索托管对象时会采取额外的、看似多余的步骤。

NSManagedObjectID *itemId = [[self.fetchedResultsController objectAtIndex:indexPath] objectID];

// Item is a NSManagedObject subclass
Item *item = (Item *)[self.fetchedResultsController.managedObjectContext existingObjectWithID:itemId error:nil];

// gets and sets item's attributes…

这不是很奇怪吗?为什么要麻烦使用objectIDexistingObjectWithID:error: 方法而不是只使用获取结果控制器的objectAtIndexPath: 方法来检索项目对象?

我做了什么来尝试理解:

(1.) 我在整本书的电子版中搜索了existingObjectWithID:error: 方法。该方法在整本书中都有使用,但我找不到对其用法的解释。

(2.) 我在 existingObjectWithID:error: 上阅读了 Apple 文档

如果已经在上下文中注册了具有给定 ID 的托管对象,则直接返回该对象;否则相应的对象将错误地进入上下文。如果数据未缓存,此方法可能会执行 I/O。与 objectWithID: 不同,此方法从不返回错误。

对象可能“错误进入上下文”,但方法“从不返回错误”。这不矛盾吗?可以说文档并没有帮助我解决这个问题。

(3.) 我想了一天,还是没有顿悟。但是,我怀疑答案与后台保存有关,稍后将添加到本书的演示应用程序中。

【问题讨论】:

    标签: ios core-data ios7 nsfetchedresultscontroller


    【解决方案1】:

    该步骤是不必要的。虽然约瑟夫解释了它的理由,但它并不真正适用。当一个对象被删除时,NSFetchedResultsController 将检测到删除并做出适当的反应。

    我怀疑约瑟夫是正确的,作者试图避免删除对象,但这不是正确的方法。如果您 NSFetchedResultsController 正在返回已删除的对象或正在从 NSFetchedResultsController 下方删除对象,那么您的应用程序还有其他可能与线程相关的问题。

    只需使用-objectAtIndexPath:

    更新

    如果您在没有 NSFetchedResultsController 的情况下获取托管对象,JosephH 的理由是否成立?

    他正在讨论的解决方案是一个能解决实际问题的创可贴。

    如果应用程序遇到正在从其下删除对象的情况,则需要解决更大的问题。

    它会起作用吗?是的。

    这是正确的答案吗,不。

    【讨论】:

    • 如果您在没有 NSFetchedResultsController 的情况下获取托管对象,JosephH 的理由是否成立?
    • 这绝对是个好点;在这种情况下,它真的不应该是必要的。不知道原作者为什么要这样写代码。
    • 什么样的线程问题会导致这种情况?我在“fetchedObjects”数组中看到具有deleted == true 的实体。
    • @AnthonyM 很多事情都可能导致这个问题,最好打开你自己的问题并列出你在做什么和你所看到的。
    【解决方案2】:

    How can I tell whether an `NSManagedObject` has been deleted? 上的讨论可能会有所帮助。

    本质上,检查是为了确保对象在使用之前确实仍然存在。如果您不这样做,当您尝试使用该对象时,如果另一个视图控制器已将其从上下文中删除并保存了该上下文,您可能会遇到异常(或其他不良行为)。

    如果对象已被删除且删除已保存,existingObjectWithId 将返回 nil。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2017-08-31
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多