同一NSManagedObjects之间的多个关系

时间:2012-10-23 16:11:11

标签: objective-c ios cocoa core-data nssortdescriptor

Author有多个Books,其中NSManagedObjects使用核心数据建模为一对多关系。 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性能有影响。理想情况下,我想尝试使用新的(ish)NSOrderedSet来按照有序的方式对关系建模,以确定是否存在性能优势。但是我无法选择哪种方式来订购这种关系,因为无论我选择哪种方式(按日期或按标题)都是非最佳的40&的时间。更不用说我以后可能想要添加更多排序的变体。

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

可能隐藏起来

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

1 个答案:

答案 0 :(得分:0)

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