【问题标题】:Using NSFetchedResultsController Without UITableView在没有 UITableView 的情况下使用 NSFetchedResultsController
【发布时间】:2011-03-14 02:25:01
【问题描述】:

NSFetchedResultsController 纯粹用于数据管理是错误的吗,即不使用它来提供UITableView

我在 Core Data iPhone 应用程序中有一个多对多关系。每当该关系中的数据发生变化时,我需要执行一个需要对该数据进行排序的计算。在 Apple 的标准部门/员工示例中,这就像确定给定部门的工资中位数一样。每当员工被添加到该部门或从该部门移除,或者员工的薪水发生变化时,都需要再次执行中位数计算。

保持数据的排序和最新状态,并在数据发生变化时收到通知,这对于 NSFetchedResultsController 来说是一项很棒的工作。唯一的“问题”是我没有使用UITableView。换句话说,我没有在UITableView 中显示已排序的员工。我只想要一个最新的员工排序数组,以便我可以在幕后分析它们。 (当然,我不想写一大堆重复NSFetchedResultsController 的代码。)

NSFetchedResultsController 纯粹用于数据管理是不是一个坏主意,即不使用它来提供UITableView?我还没有在任何地方看到这样做,并认为我可能会遗漏一些东西。

【问题讨论】:

  • 如下所述,以这种方式使用获取的结果控制器不是问题。你应该记住“过早的优化是万恶之源”。因为它是您实现的最简单的方法,请尝试它并查看它是否适用于该特定实例,然后仅在您测试并发现它不足时尝试其他方法。
  • 在这里很难反驳@TechZen 的建议。我非常喜欢 Core Data,以至于我倾向于以不同的方式看待它的内部结构。
  • 据我所知,共识是从设计的角度来看这不是一个坏主意,但它可能会影响性能,最好通过测试来评估。我希望我能接受所有的答案。

标签: iphone core-data


【解决方案1】:

我不会说它很糟糕,但绝对是“沉重”。

通过NSManagedObjectContextDidSaveNotification 监视保存并在那里进行计算将减少内存和 CPU。该通知将在其userInfo 中包含三个NSArray 实例,然后您可以对这些数组使用一个简单的NSPredicate 来查看您关心的任何员工是否已更改并做出响应。

这是NSFetchedResultsController 在幕后所做的一部分。但是,您将避免 NSFetchedResultsController 中您不关心或不需要的其他部分。

NSFetchedResultsController 进行的处理不仅仅是监视保存的对象。它处理增量、调用其代表等。我不是说它在任何形式或形式上都是不好的。我的意思是,如果你关心你的关系中的对象何时发生变化,你可以很容易地通过观察通知来做到这一点。

内存

此外,没有理由保留任何内容,因为您已经持有“部门”实体并因此访问其关系。 “以防万一”持有子对象是浪费内存。让 Core Data 管理内存,这也是使用它的部分原因。

【讨论】:

  • 感谢您的快速回答和建议!如果使用 NSFetchedResultsController 还不错,那么这听起来像是一个性能问题。在某些情况下,将排序后的数据保留在其他需要它的用户发起的计算中对我很有用。我假设 fetchedObjects 是大部分内存负担的来源。如果是这样,我将通过保留已排序的数据作为处理保存通知的一部分来失去内存节省。但是您指的额外 CPU 使用率是多少?这是在 NSFetchedResultsController 中使用 fetch 而不是关系访问器吗?
  • 您使用 fetches 根据属性查找对象。要查找关系,您可以通过调用以下获取的对象的关系来遍历对象图。遍历图更有效,因为上下文只需要故障(即没有加载属性数据的对象)来遵循关系。
  • 我保留已排序的“Employee”对象的唯一原因是避免将它们作为每个用户发起的计算的一部分。
  • 就个人而言,在这种情况下,我会创建一个方便的方法,返回排序的员工而不是保留他们,但这可以说是个人偏好。
  • 我喜欢这种方法;这就是我目前正在做的事情。 :) 好吧,实际上我首先过滤“员工”并对结果进行排序。过滤后的数据集可能相对较小。所以我想:“一次过滤/排序大数据集并缓存小结果数组而不是每次我需要排序子集时重复过滤大数据集可能更聪明吗?我可以创建一个类来管理过滤的/排序数据并使用来自 MOC 的更改通知来保持所有内容都是最新的。嗯……没有一个基本上可以做到这一点的类吗?于是我的问题就诞生了。
【解决方案2】:

在没有视图的情况下使用 NSFetchedResultsController 并没有错。您的用例听起来是不重新发明轮子的好理由。

【讨论】:

    【解决方案3】:

    对我来说,这听起来像是对 NSFetchedResultController 的恰当使用。它可能有点矫枉过正,因为它的主要用途是帮助填充和保持最新的 tableViews,但如果你愿意忍受增加的复杂性,没有理由不使用它。正确使用通知是另一种方法,它和我估计的一样复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多