【发布时间】: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.booksByDate 和author.booksByTitle。并且可能隐藏了
这样的事情可能吗?建议?请记住,我的主要目标是加快有序列表的检索速度 - 我愿意为插入/更新/删除牺牲写入时间。
【问题讨论】:
标签: objective-c ios cocoa core-data nssortdescriptor