在collectionView中每个单元格的NSFetchedResultsController

时间:2018-04-11 22:49:58

标签: ios swift core-data nsfetchedresultscontroller

我有一个带NSFetchedResultsController的collectionView。 collectionView中的某些单元格将从核心数据中查询额外的嵌入式UI元素,而这些额外的嵌入式UI元素也需要NSFetchedResultsController的更新功能。

所以我的问题是,推荐的方法是什么?

由于单元格数量以及每个单元格是否都嵌入了UI元素取决于从服务器实际获取的数据,我们不能使用NSFRC的sectionKeyPath吗?

编辑:额外的UI元素与嵌入单元格的模型不同,因此需要单独的查询(NSPredicate)。

编辑:我们的核心数据模型:

RelationModel
   type
   status
   Relationships(fromProfile, toProfile)

ProfileModel
   ..many fields
   Relationships(photos)

基本上,额外的UI元素将是toProfiles,嵌入单元格是fromProfile。但由于应用程序中存在多种关系,因此我们决定使用单独的关系模型。我发现很难设置从ProfileModel到RelationModel的关系

2 个答案:

答案 0 :(得分:1)

NSFetchedResultsController是一个非常酷的对象。它进行提取,然后监视核心数据的变化。虽然它有一个依赖于indexPaths的接口,所以很自然地将这些indexPath视为与collectionView相同的indexPaths,并不要求你这样做。 fetchedResultsController的indexPaths可以与collectionView的indexPaths不同 - 你只需要小心跟踪你正在处理哪些indexPaths并从一个indexPaths转换到另一个。

例如:您有一组从核心数据中获取的小部件。某些小部件具有extraWidgetInfo属性,您希望在UI中将其作为额外单元格显示。 fetchedResultsController表示有4个元素(全部在0节中)。但是collectionView可以将其显示为

[section1] widget1,

[section2] widget2,widget 2 extra info,

[section3] widget3,

[section4] widget4,widget 4 extra info。

虽然fetchedResultsController只说有4个元素,但collectionView中有6个单元格。在处理更新时,您还必须转换fetchedResultsController indexPath。更新将转换为重新加载部分,并且添加将转换为insertSection并在该部分中插入一些行。您还可以在核心数据更新时调用reloadData(如果数据很少更新,这可能不是一个糟糕的选择)。

答案 1 :(得分:0)

由于我们在每个单元格中都需要单独的查询,因此我们最终在每个单元格出列时设置单独的NSFetchedResultsController。然后在NSFetchedResultsController时将prepareForReuse设置为nil。