核心数据聊天应用获取一批按日期排序的消息

Posted

技术标签:

【中文标题】核心数据聊天应用获取一批按日期排序的消息【英文标题】:core data chatting applicate fetch a batch of messages ordered by date 【发布时间】:2013-10-08 10:16:12 【问题描述】:

我正在制作一个聊天应用程序。消息使用以下格式的核心数据存储:

@property (nonatomic, retain) NSDate * datetime;
@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSNumber * sent;
@property (nonatomic, retain) NSNumber * read;
@property (nonatomic, retain) DBRoom *room;
@property (nonatomic, retain) DBUser *sender;

现在我需要检索聊天室的消息。我最初的实现很简单:

self.messages = [Helper mutableArrayWithSet:self.currentRoom.messages sortKey:@"datetime" ascending:NO];

我在哪里使用辅助方法mutableArrayWithSet

+ (NSMutableArray *)mutableArrayWithSet:(NSSet *)set sortKey:(NSString *)key ascending:(BOOL)ascending 
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:ascending];
    NSArray *array = [set sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    return array.mutableCopy;

然后我只保留前 10 条消息并删除其余消息。当用户向上滚动以获取历史消息时,我再次获取并保留 20 条消息。

问题是,如果消息太多,可能会影响性能。我认为问题是self.currentRoom.messages。这很方便,但效率不高。

有没有办法逐批获取消息,例如“选择按日期时间排序的一批消息(从 20 日到 30 日)”或“选择批量大小为 10 的第三批消息,按日期时间排序”

编辑:

我刚刚阅读了文档并发现了这一点:

"您可以使用此功能来限制应用程序中的工作数据集。结合 fetchLimit,您可以创建任意结果集的子范围。 "

【问题讨论】:

使用NSFetchedResultsController 获取消息并在UITableViewCell 中显示它们 【参考方案1】:

您可以使用 NSFetchRequest - (void)setFetchBatchSize:(NSUInteger)bsize 来执行此操作。我不确定它是否适用于关系,因此您可能需要更改您的 NSFetchRequest 以直接使用 Message 实体获取,而不是使用 self.currentRoom.messages

【讨论】:

你的意思是获取前 30 名而不是获取第 20-30 名? 我不确定你在问什么。 fetchBatchSize - 这里完整解释了批量获取的工作原理。 批量大小不只是提示系统批量加速吗? 不行,你可以设置com.apple.CoreData.SQLDebug打印SQL查询到stderr,你会看到它们是分批执行的。 我已经编辑了这个问题。看来我需要使用批量大小和限制来获得子范围。

以上是关于核心数据聊天应用获取一批按日期排序的消息的主要内容,如果未能解决你的问题,请参考以下文章

从按格式化日期排序的核心数据中获取

如何从按对象创建日期排序的核心数据中获取结果?

从核心数据中获取不同的数据以及降序?

使用 Firebase 的聊天应用程序:收到新消息时获取通知 - Android

核心数据获取最后 50 个对象?

如何在核心数据iOS中获取每个实体的最后一个条目