首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >领域中的计算属性。如何更新与领域集合侦听器不同的领域?

领域中的计算属性。如何更新与领域集合侦听器不同的领域?
EN

Stack Overflow用户
提问于 2022-02-01 10:29:58
回答 1查看 264关注 0票数 0

我正在开发一个聊天应用程序。每个频道都有很多消息。我正在构建“频道列表”视图,在该视图中,我希望显示按每个频道发送的最新消息排序的所有频道。

每次发送或接收消息时,我都希望保持channel.latestMessageUpdatedAt的更新,以便以后对通道进行排序。

我想分开关注,而不必记得每次更新消息时都要更新通道。

我的策略是将侦听器内的通道更新到消息领域,但我得到以下错误

代码语言:javascript
运行
AI代码解释
复制
Error: Wrong transactional state (no active transaction, wrong type of transaction, or transaction already in progress)
代码语言:javascript
运行
AI代码解释
复制
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,我不希望所有这些都同时返回到内存中。

我也试过

代码语言:javascript
运行
AI代码解释
复制
realm.write(() => {
    channel.latestMessageUpdatedAt = new Date();
});

但我得到的错误是,一个事务已经在进行中。

EN

回答 1

Stack Overflow用户

发布于 2022-02-03 12:32:45

OP请求一个Swift解决方案,因此我有两个解决方案:哪一个是使用的,取决于数据集和关系的编码首选项。在这个问题中没有自动的逆关系,只是为了以防万一而已。

1 -没有LinkingObjects:手动逆关系

让我们用从通道到消息的1多个关系来建立模型,然后从消息返回到它的父通道建立一个逆关系。

代码语言:javascript
运行
AI代码解释
复制
class ChannelClass: Object {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var channelName = ""
    @Persisted var messageList: List<MessageClass>
}

class MessageClass: Object {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var msg = ""
    @Persisted var msgDate = ""
    @Persisted var myChannel: ChannelClass!
}

然后,在我们填充完领域之后,我们有一些类似于此的对象--记住不同的通道将在不同的时间添加消息。

代码语言:javascript
运行
AI代码解释
复制
channel 0
   message 1
   message 3
   message 4

channel 1
   message 5
   message 9
   message 10

channel 2
   message 2
   message 6
   message 7
   message 8

这样做的原因是:假设用户将消息发送到0通道,即消息1。一天后,另一个用户将消息发送到通道2,即消息2。然后,在另一天,用户将消息发送到0通道,即消息3等等。

请记住,当领域对象未排序时,List对象始终保持其顺序。因此,每个通道列表中的最后一个元素是该通道中最新的消息。

从那里开始,根据它们最近的消息排序的通道是一个班轮。

代码语言:javascript
运行
AI代码解释
复制
let messages = realm.objects(MessageClass.self).sorted(byKeyPath: "msgDate").distinct(by: ["myChannel._id"])

如果您现在迭代消息以打印通道,下面是输出。注意:这只是为了显示已经从领域中检索到的数据,并且在应用程序中不需要。

代码语言:javascript
运行
AI代码解释
复制
Channel 0 //the first message
Channel 2 //the second message
Channel 1 //the third message? Not quite

然后你对自己说:"self,等一下--第三条消息在0频道!那么为什么输出通道1是最后一条消息呢?“

其理由是OP需要只列出一次信道--因此,由于信道0已经列出,剩下的信道是通道1。

2 -与LinkingObjects:自动逆关系

以一个场景为例,使用LinkingObjects自动创建从messages对象返回到通道的反向链接,例如反向遍历对象图

代码语言:javascript
运行
AI代码解释
复制
class MessageClass: Object {
    @Persisted(primaryKey: true) var _id: ObjectId
    
    @Persisted var msg = ""
    @Persisted var msgDate = ""
    @Persisted(originProperty: "messageList") var linkedChannels: LinkingObjects<ChannelClass>
}

思维过程是相似的,但我们必须依靠斯威夫特一点点提供一种。这是一条班轮

代码语言:javascript
运行
AI代码解释
复制
let channels = realm.objects(ChannelClass.self).sorted { $0.messageList.last!.msgDate < $1.messageList.last!.msgDate }

这里要做的是查询通道,并使用每个通道列表中最后一个消息对象的msgDate属性对通道进行排序。输出是相同的

代码语言:javascript
运行
AI代码解释
复制
Channel 0 //the first message
Channel 2 //the second message
Channel 1 //see above

这里唯一的缺点是,这种解决方案将产生更大的内存影响,但增加了通过LinkingObjects实现自动反向关系的方便性。

3另一个选项

向channel类添加一个小函数和一个属性的另一个选项,既向通道messagesList添加消息,也填充通道的“lastMsgDate”属性。那么对频道进行排序就很简单了。所以看起来会是这样

代码语言:javascript
运行
AI代码解释
复制
class ChannelClass: Object {
    @Persisted(primaryKey: true) var _id: ObjectId
    
    @Persisted var channelName = ""
    @Persisted var messageList: List<MessageClass>
    @Persisted var lastMsgDate: String
    
    func addMessage(msg: MessageClass) {
        self.messageList.append(msg)
        self.lastMsgDate = msg.msgDate
    }
}

当消息被添加到通道时,最后一个消息日期将被更新。然后通过lastMsgDate对通道进行排序

代码语言:javascript
运行
AI代码解释
复制
someChannel.addMessage(msg: someMessage)

注意:为了简单起见,我使用String作为消息日期。如果要这样做,请确保它是yyyymmddhhmmss格式,或者只使用实际的日期属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70945686

复制
相关文章
计算机领域中的“模式”
在计算机科学和软件开发领域,我们经常听到“模式”这个词。从设计模式、架构模式,到开发模式,模式的概念贯穿了软件开发的每一个阶段。那么,模式到底是什么?它的意义和价值又在哪里?让我们一起来探讨一下。
运维开发王义杰
2023/08/10
2700
计算机领域中的“模式”
如何评估IT领域中的可观测性技术?
控制领域中,研究可观测性的目的是提供基于系统内部状态(白盒),而非系统外部输出(黑盒)进行控制的理论依据。
清华土著
2022/03/03
7080
如何评估IT领域中的可观测性技术?
艺术领域中的Tensorflow应用
摘要 本次演讲内容主要分为三个方面,首先会简单介绍一下Tensorflow,然后简单讲解可以用Tensorflow实现的深度神经网络算法,之后再介绍这些算法的一个有趣应用场景,也就是gener
IT大咖说
2018/04/03
9660
艺术领域中的Tensorflow应用
NLP领域中的迁移学习现状
在过去一年多的时间里,以预训练模型形式进行的迁移学习已经成为NLP领域的主流,许多任务的基准都因而得到极大地提升。然而事实上迁移学习在NLP中并不是最近才出现的。
AI科技评论
2019/09/03
8960
NLP领域中的迁移学习现状
前端基础-计算属性与侦听器
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。因此我们可以使用方法,来进行运算并返回数据:
cwl_java
2020/03/26
8020
云计算领域中你需要知道的 52 个术语
本文介绍了云原生架构中的 5 个核心概念,包括服务、容器、微服务、API 和 Kubernetes。作者还解释了这些概念如何与云原生技术和 DevOps 实践相结合,以构建可伸缩、易于维护和高可用的应用程序。
Techeek
2018/01/03
2.4K0
芯片制造之掩模领域中的术语
本文记录芯片制造中的掩模部分术语。 A 名词 解释 AAPSM/Levenson Alternating Aperture Phase Shift Mask (see also Levenson) an etched quartz reticle which incorporates a light blocking layer of chrome or moly silicide coupled with etched quartz trenches, to create alternating 0
为为为什么
2023/02/21
1.3K0
芯片制造之掩模领域中的术语
医疗领域中的AI/ML机会前景
尽管有数百个项目和数千位数据科学家致力于将AI / ML引入医疗保健领域,但采用率仍然很低且缓慢。
DrugAI
2021/01/29
6190
边缘计算领域中的工作必需的五项职业技能
随着越来越多的企业采用边缘计算技术,相关的工作机会也在不断涌现。求职者可以学习在这个新兴领域担任职位所需的基本技能。
静一
2022/12/08
3540
市场营销领域中的AI和ML
【导读】人工智能(AI)和机器学习(ML)在各个领域改变着我们的生活,本文介绍了在市场营销和广告服务行业中的AI和ML应用。市场营销和广告服务离不开对用户行为数据进行分析,如今利用人工智能和机器学习技
WZEARW
2018/04/13
1.1K0
市场营销领域中的AI和ML
人工智能在计算机视觉及网络领域中的应用
这些年人工智能技术已经全面深入到人们日常生活中去,为人们日常生活提供了各种便利条件。计算机应用,人工智能现象, 已经成为当前计算机市场的常态。本篇文章主要分析计算机网络应用人工智能的重要性。简要阐释人工智能技术基本理论,然后分析计算机应用过程中,人工技能技术存在的问题。分析当前市场计算机网络哪些方面应用了人工智能技术。这些在计算机网络中的应用的人工智能技术又为人们的生活带来了怎样的便利。
用户9882025
2022/07/27
7020
人工智能在计算机视觉及网络领域中的应用
金融领域中的机器学习—现在和未来
在移动银行,熟练的聊天机器人或搜索引擎出现之前,机器学习在金融领域就有广泛应用。由于交易量比较大,交易历史数据精确完备,以及金融领域的量化分析特点,金融领域是比较适合人工智能技术应用的领域。现在,金融领域出现了很多机器学习的应用场景,这主要是由计算能力的提高以及机器学习技术方法的普及推动的(比如谷歌的Tensorflow)。 今天,机器学习已经成为金融生态中不可或缺的组成部分,从贷款审批到资产管理,到风险评估。但是,很少有专业人士能够准确地知道机器学习在每天的日常金融应用中有多少应用模式。 TechEme
点滴科技资讯
2018/04/28
3.8K0
目标检测领域中的数据不均衡问题综述
paper链接:https://arxiv.org/abs/1909.00169.pdf
3D视觉工坊
2020/12/11
1.2K0
目标检测领域中的数据不均衡问题综述
【Embedding】EGES:阿里在图嵌入领域中的探索
今天学习的是阿里巴巴 2018 年的论文《Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba》。
阿泽 Crz
2020/07/21
2.6K0
【Embedding】EGES:阿里在图嵌入领域中的探索
Vue计算属性和侦听器
模板内的表达式非常便利,但放入太多的逻辑会让模板过重且难以维护,所以,对于复杂的逻辑,可以使用计算属性 computed。
Leophen
2019/08/23
6850
vue中的计算属性和侦听器
计算属性是基于响应式数据进行计算得出的结果并被缓存的属性。在组件的模板中可以像数据属性一样使用,它由一个计算函数和它所依赖的数据组成,只有当所依赖的数据发生变化时,它才会重新计算属性的值。Vue.js 内部实现了缓存机制,因此计算属性只会在必要的时候才重新计算。这样能够提高 Vue.js 应用的性能,并且让代码更加简洁和易于维护。
九仞山
2023/10/14
3070
推荐系统领域中那些巧妙运用的idea
本人于2019年12月份在知乎平台上提出了《在推荐系统领域有什么巧妙的idea》的问题,截止目前已经有近1k关注,近40k的浏览,可见大家对于推荐系统领域的广泛关注。
张小磊
2020/04/21
7680
遥感领域中无监督域适应综述
本篇综述详细介绍了195篇与遥感无监督域适应相关的论文,已经被Remote sensing 2022收录。
CV君
2023/03/06
1.1K0
遥感领域中无监督域适应综述
对比学习(Contrastive Learning)在CV与NLP领域中的研究进展
目前NLP领域的经验,自监督预训练使用的数据量越大,模型越复杂,那么模型能够吸收的知识越多,对下游任务效果来说越好。这可能是自从Bert出现以来,一再被反复证明。
对白
2022/04/01
8500
对比学习(Contrastive Learning)在CV与NLP领域中的研究进展
点击加载更多

相似问题

如何根据领域中的特定属性更新领域对象?

30

领域中的索引属性

10

更新领域中的表

10

更新领域中的对象

40

领域中缺少主键属性

142
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档