TableView,以正确的顺序显示来自核心数据NSSet的记录

时间:2011-01-10 05:54:30

标签: uitableview sorting core-data nsset

我已经研究了一段时间,我认为有很多解决方案,但我不确定它们是那么好。可能是我错过了一些东西: - )

我有两张桌子。对于TableA中的每条记录,TableB中有多条记录。即一对多的关系。我已经将它映射到核心数据中并生成了类。到目前为止一切都很好。

我的基于表格视图的UI需要如下所示:

Section 1
Cell 1: Table A: field1
Cell 2: Table A: field2
-----
Section 2
Cell 1: Table B: record 1: field1
Cell 2: Table B: record 2: field1
....

当我在tableView:cellForRowAtIndexPath:时,它很容易处理第1节单元格,因为它们与单个表格A记录的字段不同。第2节细胞是不同的。每次调用tableView:cellForRowAtIndexPath:时,我都需要从表A的NSSet中获取正确的表B记录。这就是问题所在。

NSSet doco表示它没有保留订单。这意味着如果我想要一个基于索引的特定记录,我有几种可能的技术:

  • 向核心数据查询添加排序描述符,并使用快速枚举来获取我想要的记录。我不知道这是否有效,因为我们仍在使用NSSet。
  • 在获取数据以生成NSArray之后使用排序描述符对NSSet进行排序,并在启动表加载之前将其存储在属性中。
  • 我现在想到的第三个选项是为NSSet写一个装饰器,它像NSArray一样,允许我指定一个排序字段并自动跟踪对NSSet的更改。棘手,但从长远来看可能会得到回报。

这些答案都不是很好。有一个更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您只是想要对象,请使用NSSet访问器。

如果您希望对象排序,请设置NSFetchRequest并添加相应的NSSortDescriptors。

然后,只需使用executeFetchRequest:error:

执行抓取

更好,因为这是专门用于tableView的,所以使用NSFetchedResultsController来填充表视图。这就是它的用途。

答案 1 :(得分:0)

我最终将NSArray存储在控制器中并将NSSet记录排序到其中。