同一个 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.booksByDate
和author.booksByTitle
。并且可能隐藏了
这样的事情可能吗?建议?请记住,我的主要目标是加快有序列表的检索速度 - 我愿意为插入/更新/删除牺牲写入时间。
【问题讨论】:
【参考方案1】:我建议在请求排序书籍时尝试进行排序。如果您在 UITableView 或类似的界面元素上显示此列表,则可以使用 NSFetchedResultsController 及其缓存系统来缓存已排序书籍的列表。这意味着当您尝试访问按日期/标题排序的书籍时,确定书籍顺序的计算已被缓存,您的列表将生成更快。我为类似问题 here 提供了类似的解决方案。
【讨论】:
以上是关于同一个 NSManagedObjects 之间的多重关系的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 - 在多个线程之间共享 NSManagedObjects
为啥我的 NSManagedObjects 数组失去了它的属性?
NSPredicate 和 NSManagedObjects 的 NSSet