iOS 核心数据关系一对多 vs. fetchedResultsController 速度
Posted
技术标签:
【中文标题】iOS 核心数据关系一对多 vs. fetchedResultsController 速度【英文标题】:iOS Core-Data Relationship one-to-many vs. fetchedResultsController speed 【发布时间】:2015-02-07 12:57:51 【问题描述】:我正在使用 Core-Data 存储来自联系人的消息
我创建了一个“联系人”表和一个“消息”表。
每条消息都与联系人是一对一的关系 每个联系人与每个联系人的消息都是一对多的关系现在,为了显示消息,我使用一个简单的 fetchedResultsController 并将联系人作为谓词。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"contact = %@", self.contact];
一旦消息的数量开始产生结果,加载需要一些时间,因为我无法从它们的关系中索引消息。
我知道我可以访问关系中的所有联系人消息,但我还需要类似于
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
为了在有新消息显示时立即更新视图...
我想我的问题是:
-
从联系人一对多的关系中访问消息会比 fetchedResultsController 在消息数为结果的情况下更快吗?
我可以用这个从最新到最旧的消息排序吗?
我可以在没有 fetchedResultController 的情况下跟踪联系人消息中的任何更改吗? (可以更改/添加/删除消息)
或者有没有办法用关系索引消息表?
对于 3. 我知道我可以收听任何 NSManagedObjectContextObjectsDidChangeNotification,但问题是我不在乎另一个联系人是否在我在另一个联系人上发送消息...我还没有找到为此模型使用 KVO 的聪明方法。
【问题讨论】:
【参考方案1】:您最好的选择可能是保留 FRC,并将获取请求配置为适当地进行批处理。可以说您并不总是需要设备上的所有旧消息,您可以在它们达到一定年龄时删除它们,然后从服务器查询用户是否需要它们。
对于排序,您需要为实体添加一个属性并设置它(如果您还没有),然后在您的获取请求中设置排序描述符。
【讨论】:
所以你说的不是使用关系,而是我应该在messages表上放置一个属性,索引联系人的id,并获取id的消息? 对于排序,我已经有一个日期属性,使用 FRC 时是排序,但在访问来自联系人关系的消息时不是排序 如果你需要一个有序的关系,你可以使用一个,但是你需要管理这个顺序。如果您已经有了日期,那么您可以获取关系内容,然后从该集合中创建一个排序数组。 FRC 仍然是批处理管理的最佳选择,无论如何您都应该以限制消息计数为目标。 我已经在使用[fetchRequest setFetchBatchSize:20];
,在 UITableView 顶部有一个“加载更多消息”,这将增加 FetchBatchSize...但问题是当有 500 条消息时,在某一时刻抓取时间会很长……(比如 2-3 秒)
您永远不会增加批量大小,只需滚动表格,它将从 FRC 请求更多数据(它将根据需要加载下一批)...以上是关于iOS 核心数据关系一对多 vs. fetchedResultsController 速度的主要内容,如果未能解决你的问题,请参考以下文章