1

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

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

问题 1

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

@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.booksByDateandauthor.booksByTitle中。并且可能隐藏

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

4

1 回答 1

0

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

于 2012-10-23T16:22:02.017 回答