我正在构建一个聊天应用程序。每个频道都有许多消息。我正在构建频道列表视图,我想在其中显示按每个频道发送的最新消息排序的所有频道。
每次发送或接收消息时,我都希望保持channel.latestMessageUpdatedAt
最新,以便以后对频道进行排序。
我想将关注点分开,而不必记住每次更新消息时都更新频道。
我的策略是将侦听器内的通道更新到消息领域,但出现以下错误
Error: Wrong transactional state (no active transaction, wrong type of transaction, or transaction already in progress)
const ChannelSchema = {
name: "channel",
primaryKey: "id",
properties: {
id: "string",
latestMessageUpdatedAt: "date",
},
};
const MessageSchema = {
name: "message",
primaryKey: "id",
properties: {
id: "string",
channelId: "string",
text: "string",
updatedAt: "date",
},
};
const realm = await Realm.open({
path: "default.realm",
schema: [ChannelSchema, MessageSchema],
schemaVersion: 0,
});
const messagesRealm = realm.objects("message");
messagesRealm.addListener((messages, changes) => {
for (const index of changes.insertions) {
const channel = realm.objectForPrimaryKey(
"channel",
messages[index].channelId
);
if (!channel) continue;
const message = messages[index];
channel.latestMessageUpdatedAt = new Date();
}
});
我已经检查了文档,似乎没有理由说明这是不可能的。
也许有一个更好的方法来获得这个计算域。
请注意,我考虑过在通道上嵌入对象/消息列表,但消息的数量可能高达 10k,我不希望所有这些都立即返回到内存中。
我也试过做
realm.write(() => {
channel.latestMessageUpdatedAt = new Date();
});
但我收到交易已经在进行中的错误。