【问题标题】:Transient sectionNameKeyPath & NSSortDescriptor NSFetchedResultsController瞬态 sectionNameKeyPath & NSSortDescriptor NSFetchedResultsController
【发布时间】:2012-05-15 22:44:54
【问题描述】:

我在 Core Data 中有一个任务列表。我使用 NSFetchedResultsController 将它们提取到 UITableView 中。

我需要按自定义顺序自定义部分:

  1. 过期
  2. 活动中
  3. 正在进行中
  4. 推迟
  5. 已完成

为了确定任务应该进入哪个部分,我使用基于相关对象中的其他属性动态计算的派生瞬态属性。

很遗憾,您不能将派生值作为获取请求使用的排序描述符传递。这是因为获取依赖于已经有被要求获取的数据。鸡肉和鸡蛋。

我明白为什么我做不到,这并不能帮助我解决问题!

我试过了:

  • 将 NSFetchedResultsController 子类化为“customise creation of sections and index titles”。也许我做错了,但这只是改变了部分的名称和顺序,而不是这些部分中有多少东西(这很关键)。

  • 按部分填充数组并将它们提供给表(笨重, 缓慢但完全有效)。

  • 删除正在进行和推迟的任务(这可行,但并不理想)。这样我可以按dueDate 排序并通过瞬态值驱动sectionNameKeyPath。

有没有人有更好的想法?像这样的问题已经有不少了,但没有一个能找到一个简洁的解决方案。

提前致谢!

干杯

【问题讨论】:

  • 一个选项可能是 - 如果您已经从核心数据中获取所有任务 - 也许您可以为每个任务保存额外的属性 - 如果任务“即时”更改部分 - 它也可以更新在核心数据中 - 因此 - 动画由 controllerWillChangeContent: 委托方法重新定位在正确的部分?还是我错过了什么?

标签: iphone objective-c xcode nsfetchedresultscontroller


【解决方案1】:

最简单的解决方案是添加一个持久的“部分”属性(或转换您现有的瞬态属性)。使其成为一组可排序的值(在运行时使用所需的名称显示)。每当您更新任何记录时,也要重新计算和存储 section 属性。

我意识到这听起来像是您在存储冗余信息,但除了使您的逻辑更简单之外,它还可以索引,从而加快访问速度。

【讨论】:

  • 嗨,丹尼斯,感谢您的回复。由于更改日期会将项目移动到不同的部分,我想知道如何有效地检查/更改部分属性?
  • 这个答案 + Guntis Treulands 对我的问题的评论效果很好:)
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多