多个nsfetchedresultscontrollers或单个控制器

时间:2015-03-25 16:31:01

标签: ios core-data nsfetchedresultscontroller

我正在使用核心数据,而且我的UITableView具有动态数量的部分。

我有一个名为dates的实体 - 它让我们说一个标题和一个指向另一个实体的关系 - 该实体的id是将显示的部分数据。

哪种方法最好才是最好的方法?为什么?

一个。有一个NSFetchedResultControllers数组 - 在每个部分我使用谓词过滤数据。然后我只是将数据呈现给每个部分。

B中。我有一个NSFetchedResultController并且我获取所有数据 - 然后在我的CellForRow中我检查是否应该呈现它们。

℃。我删除了这个关系,并在我的实体中添加了一个名为sectionId的额外属性,并使用A或B.

在UI性能方面,最佳方法是什么?

编辑:

示例 - 我有

实体1:数据

Data Id : 0, Title : First, (Relationship) section : 0
Data Id : 1, Title : Second, (Relationship) section : 0
Data Id : 2, Title : FisrtB, (Relationship) section : 1

Entiry 2:SectionsName

SectionId : 0 , Name : TitleA , etc (to-many- relationhsip to Data)
SectionId : 1 , Name : TitleB , etc (to-many- relationhsip to Data)

所以,问题实际上是:

  • 甲。有一个FRC返回所有数据(总共3个)然后我应该 找到他们去的正确部分?
  • B中。或者每个部分都有一个FRC - 第一个FRC返回top2 我可以通过indexPath.row访问的数据,第二个相同的数据 FRC。

3 个答案:

答案 0 :(得分:1)

看起来虽然你只需要实体2(sectionID)中的一个属性,但你仍然需要这个关系以获得该实体并最终获得该属性(sectionID)。因此我建议选项B. FRC越少越好。你在这里只需要一个。在CellForRow中,您将使用indexPath获取获取结果数组中的当前实体。获得当前实体后,您现在可以访问实体2,它是第一个实体的属性。拥有实体2后,您现在拥有了您想要的属性,即实体2的部分ID。您现在可以在表格视图中显示该属性(部分ID)。

答案 1 :(得分:1)

编辑以反映对原始问题的更改

您几乎肯定应该使用原始问题中的选项B(后续编辑中的选项A):单个NSFetchedResultsController,基于Data实体,但表格视图部分由{{确定1}}关系。

您获取的结果控制器可以完成将对象划分为正确部分的所有艰苦工作:确保FRC底层的提取首先按section排序(如果您愿意,可以section.sectionId) ,并将FRC的section.name指定为sectionNameKeyPath(或section.sectionId)。然后,样板FRC / tableView代码会自动将对象放入正确的部分。

上述样板代码:

section.name

答案 2 :(得分:1)

几乎可以肯定只使用一个获取的结果控制器。 (我同意@Lee这一点,但我不明白为什么他推荐选项B,其中包括更多 FRC。)

总结您的数据模型:

Section <------->> Date

您只需获取该部分,然后调整datasource方法:

// number of sections
return self.fetchedResultsController.fetchedObjects.count;

// number of rows in section
Section *section = [self.fetchedResultsController objectAtIndexPath:
  [NSIndexPath indexPathForRow:section inSection:0]];
return section.dates.count;

// cellForRowAtIndexPath
/* create a convenience function in the Section class to return a
   sorted array from the NSSet "dates". */
Section *section = [self.fetchedResultsController objectAtIndexPath:
  [NSIndexPath indexPathForRow:indexPath.section inSection:0]];
Date *date = section.sortedDates[indexPath.row];
/* configure the cell based on the date object */

因此, A 是更好的选择。