同一个 NSManagedObjects 之间的多重关系

Posted

技术标签:

【中文标题】同一个 NSManagedObjects 之间的多重关系【英文标题】:Multiple relationships between the same NSManagedObjects 【发布时间】:2012-10-23 16:11:11 【问题描述】:

一个Author 有多个Books,它们都是NSManagedObjects,使用Core Data 建模为一对多关系。 20% 的时间我只需要知道作者写了多少本书,所以我查看author.books

40% 的时间我需要这些数据(按发布日期的顺序),40% 的时间我需要它按标题排序。多个类会想要访问这些有序列表。

问题 1

Author : NSManagedObject 中添加两个额外的方法是否合理?由于我需要从多个地方请求它们,因此它似乎比每次在发出请求的类中对 NSSet 进行排序更聪明。即:

@property NSSet *books; //core data generated - just returns the unordered set
- (NSArray *)booksByDate //applies an NSSortDescriptor to self.books, returns an NSArray
- (NSArray *)booksByTitle //applies an NSSortDescriptor to self.books, returns an NSArray

问题 2

事实证明,使用 NSSortDescriptor 的成本很高,并且会影响 UI 性能。理想情况下,我想尝试使用 new(ish) NSOrderedSet 按顺序对关系建模,看看是否有性能优势。但是我真的不能选择哪种方式来安排这种关系,因为无论我选择哪种方式(按日期或按标题),40 岁以上的时间都是非最佳的。更不用说我以后可能想添加更多排序的变体。

有什么方法可以两全其美,并在我的核心数据模型中存储 3 次关系?一次用于无序关系 (NSSet),一次用于有序关系 (NSOrderedSet)。如果保持所有三个属性彼此一致可以是自动的,我只会考虑这一点 - 也许通过调整 NSManagedObject 添加/删除/更新其书籍的方式。例如,我想以某种方式自定义author.addBook 以将同一本书(在正确的位置)插入author.booksByDateauthor.booksByTitle。并且可能隐藏了

这样的事情可能吗?建议?请记住,我的主要目标是加快有序列表的检索速度 - 我愿意为插入/更新/删除牺牲写入时间。

【问题讨论】:

【参考方案1】:

我建议在请求排序书籍时尝试进行排序。如果您在 UITableView 或类似的界面元素上显示此列表,则可以使用 NSFetchedResultsController 及其缓存系统来缓存已排序书籍的列表。这意味着当您尝试访问按日期/标题排序的书籍时,确定书籍顺序的计算已被缓存,您的列表将生成更快。我为类似问题 here 提供了类似的解决方案。

【讨论】:

以上是关于同一个 NSManagedObjects 之间的多重关系的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 在多个线程之间共享 NSManagedObjects

丢弃 NSManagedObjects

为啥我的 NSManagedObjects 数组失去了它的属性?

NSPredicate 和 NSManagedObjects 的 NSSet

NSManagedObjects 的深拷贝 NSMutableArray

NSManagedObjects 的 isEqual