当前位置: 首页 > news >正文

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录

应用全局UI状态存储和持久化V2版本

AppStorageV2

connect

remove

keys

示例

使用限制

PersistenceV2

connect

remove

keys

save

notifyOnError

 示例

使用限制

@Type

 使用限制


应用全局UI状态存储和持久化V2版本

以下实例AppStorageV2、PersistenceV2和装饰器@Type都需要搭配@ComponentV2使用。

AppStorageV2

AppStorageV2是在应用UI启动时会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorageV2将在应用运行过程保留其数据。数据通过唯一的键字符串值访问。

AppStorageV2支持应用的主线程内多个UIAbility实例间的状态共享

connect

用于在AppStorageV2实例中创建键值对数据或者获取实例中key对应的值,返回创建或获取的值(类实例|undefinded)。返回的不为undefined情况下,该值改变,对应AppStorageV2存储中的值也会改变。

AppStorageV2.connect<T extends object>(type: TypeConstructorWithArgs<T>, keyOrDefaultCreator?: string | StorageDefaultCreator<T>, defaultCreator?: StorageDefaultCreator<T>): T | undefined;
参数名类型必填说明
typeTypeConstructorWithArgs<T>指定的类型,若未指定key,则使用type的name作为key。
keyOrDefaultCreatorstring | StorageDefaultCreator<T>指定的key,或者是获取默认值的构造器。
defaultCreatorStorageDefaultCreator<T>获取默认值的构造器。

有4种形式入参:

AppStorageV2.connect(Sample)

1个参数,类名。相当于AppStorageV2.connect(Sample,"Sample")。

AppStorageV2.connect(Sample,"Sample1")

2个参数,类名+字符串。表示获取AppStorageV2中"Sample1"对应的值,该值的类型为Sample,获取不到返回undefined。

AppStorageV2.connect(Sample,()=>new Sample())

2个参数,类名+默认值构造器。相当于AppStorageV2.connect(Sample,"Sample",()=>new Sample)

AppStorageV2.connect(Sample,"Sample2",()=>new Sample())

3个参数,类名+字符串+默认值构造器。先获取AppStorageV2中"Sample2"对应的值,如果获取不到,则通过调用默认值构造器,将结果存入AppStorageV2值中,key为"Sample2"。

注意:使用时,该方法可能返回undefined,故在给@Local等装饰器修饰的变量赋值时需要在最后加上感叹号!,用来避过undefined的类型检测,表示我确认不会返回undefined。

 

remove

用于删除AppStorageV2实例中指定的键值对数据,返回undefined。

AppStorageV2.remove<T>(keyOrType: string | TypeConstructorWithArgs<T>): void
参数名类型必填说明
keyOrTypestring | TypeConstructorWithArgs<T>需要删除的key;如果指定的是type类型,删除的key为type的name。

只有一种入参方式,可以传类名或者字符串。传类名表示直接删除类名对应字符串后的键值对。 

注意:删除AppStorageV2中不存在的key会有Warning提示The key to be deleted does not exist。

keys

AppStorageV2.keys(): Array<string>

返回AppStorageV2实例中的所有key(Array<string>)。

示例

Navigation组件跳转页面时,首页不会重复渲染,返回不会重复渲染,pushPathByName会重新渲染新页面,故下例中首页只会渲染一次,每次跳到page2页面都会渲染一个新的。

1.点击Page1 p1、Page2 p2,p1数字会变动,p2不会,由于@Trace只装饰了p1,p2的实际值增加了,但是由于UI没刷新(在第2步中可以看出来)。

2.点击跳转page2,p1、p2的数字都同步过去了,由于都是在AppStorageV2实例中获取的Sample键值对。

3.点击Page2中按钮,在AppStorageV2中创建一个新的键值对Sample1,当前页面p1、p2的值会还原。

4.点击返回,由于首页不会刷新,这时无变化。

5.点击all keys in AppStorage,触发该段文字ui刷新,发现多了一个Sample1的key。

6.点击remove key按钮AppStorageV2中的Sample键值对删除了。

7.点击跳转page2,发现应用直接报错了,这是由于page2页面重新渲染,其中下面代码AppStorageV2.connect(Sample)返回undefined,@Local不能初始化值传入undefined。

@Local prop: Sample = AppStorageV2.connect(Sample)!;

注意:需要在真机环境运行,在预览环境会报错。

Index.ets页面

// Index.ets
import { AppStorageV2 } from '@kit.ArkUI';// 数据中心
@ObservedV2
export class Sample {@Trace p1: number = 0;p2: number = 10;
}@Entry
@ComponentV2
struct Page1 {// 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联@Local prop: Sample = AppStorageV2.connect(Sample,'Sample',()=>new Sample())!;@Local prop1: String = "1"pageStack: NavPathStack = new NavPathStack();fontSize(){console.log("all keys in AppStorage:渲染了一次")return 30}build() {Navigation(this.pageStack) {Column() {Button('Go to page2').onClick(() => {this.pageStack.pushPathByName('Page2', null);})Button('Page1 connect the key Sample').onClick(() => {// 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联this.prop = AppStorageV2.connect(Sample,()=>new Sample())!;})Button('Page1 remove the key Sample').onClick(() => {// 从AppStorageV2中删除后,prop将不会再与key为Sample的值关联AppStorageV2.remove(Sample);})Text(`Page1 p1: ${this.prop.p1}`).fontSize(30).onClick(() => {this.prop.p1++;})Text(`Page1 p2: ${this.prop.p2}`).fontSize(30).onClick(() => {// 页面不刷新,但是p2的值改变了this.prop.p2++;})// 获取当前AppStorageV2里面的所有keyText(`${this.prop1}all keys in AppStorage: ${AppStorageV2.keys()}`).fontSize(this.fontSize()).onClick(() => {// 页面不刷新,但是p2的值改变了this.prop1 = this.prop1+'1'})}}}
}

Index2.ets页面

// Page2.ets
import { AppStorageV2 } from '@kit.ArkUI';
import { Sample } from './Index';@Builder
export function Page2Builder() {Page2()
}@ComponentV2
struct Page2 {// 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联@Local prop: Sample = AppStorageV2.connect(Sample)!;pathStack: NavPathStack = new NavPathStack();fontSize(){console.log("渲染了一次11")return 30}build() {NavDestination() {Column() {Button('Page2 connect the key Sample1').onClick(() => {// 在AppStorageV2中创建一个key为Sample1的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联this.prop = AppStorageV2.connect(Sample,"Sample1",()=>new Sample())!;})Text(`Page2 p1: ${this.prop.p1}`).fontSize(30).onClick(() => {this.prop.p1++;})Text(`Page2 p2: ${this.prop.p2}`).fontSize(this.fontSize()).onClick(() => {// 页面不刷新,但是p2的值改变了;只有重新初始化才会改变this.prop.p2++;})// 获取当前AppStorageV2里面的所有keyText(`all keys in AppStorage: ${AppStorageV2.keys()}`).fontSize(30)}}.onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack;})}
}

使用Navigation组件时,需要添加配置系统路由表文件,先在module.json5中添加:"routerMap": "$profile:route_map",表示使用src/main/resources/base/profile目录下的route_map.json文件作为路由表。故在该目录下创建文件route_map.json。

{"routerMap": [{"name": "Page2","pageSourceFile": "src/main/ets/pages/Index2.ets","buildFunction": "Page2Builder","data": {"description" : "AppStorageV2 example"}}]
}

使用限制

1、需要配合UI使用(UI线程),不能在其他线程使用,如不支持@Sendable。

2、不支持collections.Set、collections.Map等类型。

3、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。

 

PersistenceV2

PersistenceV2是在应用UI启动时会被创建的单例,用于储存持久化的数据。不同于AppStorageV2它会将最新数据储存在设备磁盘上(持久化)。这意味着,应用退出再次启动后,依然能保存之前的数据。

支持应用的主线程内多个UIAbility实例间的状态共享。

注意:由于将数据存储在设备磁盘上,需要将数据进行序列化(数据转为某种固定的格式进行存储,例如全部转为二进制数据)后进行存储

connect

remove

keys

PersistenceV2类型上继承了AppStorageV2,在AppStorageV2的基础上多实现了save和notifyOnError方法,所以上面3个方法使用同AppStorageV2。

save

PersistenceV2.save<T>(keyOrType: string | TypeConstructorWithArgs<T>): void;

对于与PersistenceV2关联的@ObservedV2对象,该对象的@Trace属性的变化,会触发整个关联对象的自动持久化;非@Trace属性的变化则不会,这时需要通过该方法进行手动持久化。

save说明
参数keyOrType:需要手动持久化的key;如果指定的是type类型,key为type的name。
返回值无。

入参字符串或者类名。传类名表示对类名对应字符串后的键值对进行持久化处理。 

notifyOnError

PersistenceV2.notifyOnError(callback: PersistenceErrorCallback | undefined): void;

将数据存入磁盘时,需要对数据进行序列化;当某个key序列化失败时,错误是不可预知的;可调用该接口捕获异常。

notifyOnError说明
参数callback:当序列化或者反序列化失败时,执行该回调;若传入undefined,取消该回调。
返回值无。

 示例

注意:需要在真机环境运行,在预览环境会报错。

这里示例和AppStorageV2的示例效果类似。不同在于:

1.退出应用后再次打开应用p1的值不会重置,因为使用的PersistenceV2并被@Trace修饰了,会自动持久化数据。

2.p2的值需要点击Page1 save the key Sample按钮后才会被持久化。这时退出后再打开p2的值会同步。

Index.ets页面

import { Type } from '@kit.ArkUI';
import { PersistenceV2 } from '@kit.ArkUI';// 数据中心
@ObservedV2
class SampleChild {@Trace p1: number = 0;p2: number = 10;
}@ObservedV2
export class Sample {// 对于复杂对象需要@Type修饰,确保序列化成功@Type(SampleChild)@Trace f: SampleChild = new SampleChild();
}
// 接受序列化失败的回调
PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => {console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);
});@Entry
@ComponentV2
struct Page1 {// 在PersistenceV2中创建一个key为Sample的键值对(如果存在,则返回PersistenceV2中的数据),并且和prop关联// 对于需要换connect对象的prop属性,需要加@Local修饰(不建议对属性换connect的对象)@Local prop: Sample = PersistenceV2.connect(Sample, () => new Sample())!;pageStack: NavPathStack = new NavPathStack();build() {Navigation(this.pageStack) {Column() {Button('Go to page2').onClick(() => {this.pageStack.pushPathByName('Page2', null);})Button('Page1 connect the key Sample').onClick(() => {// 在PersistenceV2中创建一个key为Sample的键值对(如果存在,则返回PersistenceV2中的数据),并且和prop关联// 不建议对prop属性换connect的对象this.prop = PersistenceV2.connect(Sample, 'Sample', () => new Sample())!;})Button('Page1 remove the key Sample').onClick(() => {// 从PersistenceV2中删除后,prop将不会再与key为Sample的值关联PersistenceV2.remove(Sample);})Button('Page1 save the key Sample').onClick(() => {// 如果处于connect状态,持久化key为Sample的键值对PersistenceV2.save("Sample");})Text(`Page1 add 1 to prop.p1: ${this.prop.f.p1}`).fontSize(30).onClick(() => {this.prop.f.p1++;})Text(`Page1 add 1 to prop.p2: ${this.prop.f.p2}`).fontSize(30).onClick(() => {// 页面不刷新,但是p2的值改变了this.prop.f.p2++;})// 获取当前PersistenceV2里面的所有keyText(`all keys in PersistenceV2: ${PersistenceV2.keys()}`).fontSize(30)}}}
}

Index2.ets 

import { PersistenceV2 } from '@kit.ArkUI';
import { Sample } from './Index';@Builder
export function Page2Builder() {Page2()
}@ComponentV2
struct Page2 {// 在PersistenceV2中创建一个key为Sample的键值对(如果存在,则返回PersistenceV2中的数据),并且和prop关联// 对于需要换connect对象的prop属性,需要加@Local修饰(不建议对属性换connect的对象)@Local prop: Sample = PersistenceV2.connect(Sample, () => new Sample())!;pathStack: NavPathStack = new NavPathStack();build() {NavDestination() {Column() {Button('Page2 connect the key Sample1').onClick(() => {// 在PersistenceV2中创建一个key为Sample1的键值对(如果存在,则返回PersistenceV2中的数据),并且和prop关联// 不建议对prop属性换connect的对象this.prop = PersistenceV2.connect(Sample, 'Sample1', () => new Sample())!;})Text(`Page2 add 1 to prop.p1: ${this.prop.f.p1}`).fontSize(30).onClick(() => {this.prop.f.p1++;})Text(`Page2 add 1 to prop.p2: ${this.prop.f.p2}`).fontSize(30).onClick(() => {// 页面不刷新,但是p2的值改变了;只有重新初始化才会改变this.prop.f.p2++;})// 获取当前PersistenceV2里面的所有keyText(`all keys in PersistenceV2: ${PersistenceV2.keys()}`).fontSize(30)}}.onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack;})}
}

 使用Navigation组件时,需要添加配置系统路由表文件,先在module.json5中添加:"routerMap": "$profile:route_map",表示使用src/main/resources/base/profile目录下的route_map.json文件作为路由表。故在该目录下创建文件route_map.json。

{"routerMap": [{"name": "Page2","pageSourceFile": "src/main/ets/pages/Index2.ets","buildFunction": "Page2Builder","data": {"description" : "AppStorageV2 example"}}]
}

使用限制

1、需要配合UI使用(UI线程),不能在其他线程使用,如不支持@Sendable。

2、不支持collections.Set、collections.Map等类型。

3、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。

4、单个key支持数据大小约8k,过大会导致持久化失败。

5、持久化的数据必须是class对象,不能是容器(如Array、Set、Map),不能是buildin的构造对象(如Date、Number)。

6、不支持循环引用的对象。

7、只有@Trace的数据改变会触发自动持久化,如V1状态变量、@Observed对象、普通数据的改变不会触发持久化。

8、不宜大量持久化数据,可能会导致页面卡顿。

@Type

在持久化数据时,为了实现序列化类时不丢失属性的复杂类型,可以使用@Type装饰器装饰类属性。

@Type装饰器说明
装饰器参数type:类型。
可装饰的类型Object class以及Array、Date、Map、Set等内嵌类型。

class Sample {data: number = 0;
}
// Info会在PersistenceV2中使用。
//@Local prop: Info = PersistenceV2.connect(Info , () => new Info ())!;
@ObservedV2
class Info {@Type(Sample)@Trace sample: Sample = new Sample(); // 正确用法
}

 使用限制

1、只能用在@ObservedV2装饰的类中,不能用在自定义组件中。

2、不支持collections.Set、collections.Map等类型。

3、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。

4、不支持简单类型,如string、number、boolean等。

相关文章:

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录 应用全局UI状态存储和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 应用全局UI状态存储和持久化V2版本 以下实例AppStorageV2、PersistenceV2和装饰…...

【QT】常用控件 【多元素类 | 容器类 | 布局类】

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; QT 常用控件【多元素类】 &#x1f98b; List Widget -- 列表&#x1f98b; Table Widget -- 表格&#x1f98b; Tree Widget -- 树形 二&#xff1a;&#x…...

uniapp实现图文聊天功能

Uniapp 实现图文聊天功能 下面我将介绍如何在 Uniapp 中实现一个基本的图文聊天功能&#xff0c;包括消息发送、接收和展示。 一、准备工作 创建 Uniapp 项目准备后端接口&#xff08;可以使用云开发、自己的服务器或第三方服务&#xff09; 二、实现步骤 1. 页面结构 &l…...

【场景应用9】多语言预训练语音模型进行自动语音识别

一、理论介绍 “多语言预训练语音模型进行自动语音识别”这个模块是近年来语音识别(ASR, Automatic Speech Recognition)领域非常重要的发展方向。下面我来为你系统地讲解这个模块的基础理论与算法流程,尤其聚焦在如 wav2vec 2.0 multilingual、XLSR(cross-lingual speech…...

华为HCIE-openEuler认证:能否成为国产操作系统领域的技术稀缺人才?

HCIE-openEuler是华为面向开源操作系统领域的高级专家认证&#xff0c;聚焦openEuler系统的深度运维、性能调优与生态集成。作为华为鲲鹏计算生态的核心技术栈&#xff0c;该认证要求持证者具备从底层内核优化到上层云原生适配的全栈能力。以下从技术能力、实验设计、行业适配三…...

Uniapp:列表选择提示框

目录 一、出现场景二、效果展示三、具体使用 一、出现场景 在项目的开发过程中&#xff0c;有这样一种场景&#xff0c;就是点击按钮走后续的逻辑之前还需要选择前提条件&#xff0c;就一个条件的情况下如果使用弹出框就显示比较多余&#xff0c;列表选择提示框刚好能够满足我…...

uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求

您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求。 测试步骤:1、 工作台 -打卡,申请定位权限;2、工作台-设置-编辑资料-更换头像,申请相机、存 储权限。 修改建议:APP在申请敏感权限时,应同步说明权限申…...

李宏毅NLP-4-语音识别part3-CTC

Connectionist Temporal Classification&#xff5c;CTC 基于连接主义时间分类&#xff08;CTC&#xff09;的语音识别架构&#xff0c;具体描述如下&#xff1a; 输入层&#xff1a;底部的 x 1 , x 2 , x 3 , x 4 x^1, x^2, x^3, x^4 x1,x2,x3,x4代表输入的语音信号分帧数据…...

基于.NET后端实现图片搜索图片库 核心是计算上传图片与库中图片的特征向量相似度并排序展示结果

基于.NET 后端实现图片搜索图片库的方案&#xff0c;核心是计算上传图片与库中图片的特征向量相似度并排序展示结果。 整体思路 图像特征提取&#xff1a;使用深度学习模型&#xff08;如 ResNet&#xff09;提取图片的特征向量。特征向量存储&#xff1a;将图片的特征向量存…...

数据中台(大数据平台)之数据仓库建设

数据中台作为企业数据管理的核心枢纽&#xff0c;应支持并促进企业级数据仓库的建设&#xff0c;确保数据的有效整合、治理和高效应用。在建设数据仓库的过程中&#xff0c;设计和规划显得尤为重要&#xff0c;需要深入理解业务需求&#xff0c;制定合理的技术架构&#xff0c;…...

设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用

目录 一、设计思路 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 二、UML类图&#xff08;PlantUML格式&#xff09; 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 三、实现过程与结果 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 四、总结 在面向对…...

在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例

目录 1. 需求2. 项目准备3. VUE CLI项目部署3.1 部署前的准备3.1.1 后端通信路由修改3.1.2 导航修改 3.2 构建项目3.3 配置nginx代理 4. 后端配置4.1 其他依赖项4.2 单次执行测试4.3 创建Systemd 服务文件4.4 配置 Nginx 作为反向代理 5. 其他注意事项 1. 需求 近期做一些简单…...

解决前端vue项目在linux上,npm install,node-sass 安装失败的问题

Unable to save binary /var/lib/jenkins/workspace/xxx/node_modules/node-sass/vendor/linux-x64-72 : Error: EACCES: permission denied, mkdir ‘/var/lib/jenkins/workspace/x/node_modules/node-sass/vendor’ 这个是node-sass安装失败导致的。 #将npm的默认仓库更改为…...

FPGA_YOLO(四)用HLS实现循环展开以及存储模块

Vivado HLS&#xff08;High-Level Synthesis&#xff0c;高层次综合&#xff09;是赛灵思&#xff08;Xilinx&#xff09;在其 Vivado 设计套件 中提供的一款工具&#xff0c;用于将 高级编程语言&#xff08;如 C、C、SystemC&#xff09; 直接转换为 硬件描述语言&#xff0…...

用户组与用户

用户组管理&#xff1a; 创建用户组&#xff1a; groupadd 用户组名 删除用户组&#xff1a; groupdel 用户组名 用户管理&#xff1a; 创建用户 useradd [-g -d] 用户名 -g&#xff1a;指定用户的组 -d&#xff1a;指定用户的home路径&#xff0c;如果不加上&…...

npm install 报错常见的解决方法

npm install 报错的情况有很多种&#xff0c;每种错误的具体解决方案也有所不同。这里我将汇总一些常见的npm install报错及其解决办法&#xff1a; 1. 下载速度慢/网络问题 解决办法&#xff1a;更换npm包的镜像源至国内镜像&#xff0c;如淘宝npm镜像&#xff1a;npm confi…...

暂存一下等会写

#include<easyx.h> IMAGE SNOW 图形变量 struct MOVE生存结构体 {int x0;int y0; bool livefalse;}; initgraph(800, 800);初始化图形界面 MOVE snowflake[5000];目标数量 loadimage(&SNOW, "snow.png");加载图片 BeginBatchDraw(); 开始批量绘图。…...

C语言 —— 指尖跃迁 刻印永恒 - 文件操作

目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 二进制文件和文本文件 3. 文件的打开与关闭 3.1 流和标准流 3.2 文件指针 3.3 文件的打开与关闭 fopen fclose 4. 文件的顺序读写 4.1 fgetc和fputc fgetc fputc 4.2 fgets和fputs fgets fputs…...

第二章 DQL查询语句

第一章&#xff1a;基础查询 一、SELECT 语句 作用 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 语法 SELECT column1, column2, … FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; column1, column2, …...

系统与网络安全------弹性交换网络(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 Trunk原理与配置 Trunk原理概述 Trunk&#xff08;虚拟局域网中继技术&#xff09;是指能让连接在不同交换机上的相同VLAN中的主机互通。 VLAN内通信 实现跨交换的同VLAN通信&#xff0c;通过Trunk链路&am…...

有哪些哲学流派适合创业二

好的&#xff0c;让我们更深入地探讨如何将‌哲学与数学‌深度融合&#xff0c;构建一套可落地的创业操作系统。以下从‌认知框架、决策引擎、执行算法‌三个维度展开&#xff0c;包含具体工具和黑箱拆解&#xff1a; ‌一、认知框架&#xff1a;用哲学重构商业本质‌ 1. ‌本体…...

Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例

目录 一、背景&#xff1a;为什么Python需要JSON&#xff1f;二、核心技术解析&#xff1a;序列化与反序列化2.1 核心概念2.2 类型映射对照表 三、Python操作JSON的四大核心方法3.1 基础方法库3.2 方法详解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、实战…...

Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算

作为 Sui 安全工具包中的强大新成员&#xff0c;Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造&#xff0c;支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…...

投资理财_从0到1:如何用1000元开启你的二级市场投资之旅?

投资理财_从0到1&#xff1a;如何用1000元开启你的二级市场投资之旅&#xff1f; 一、前言&#xff1a;投资不是赌博&#xff0c;而是科学与艺术的结合1.1 为什么学习二级市场投资&#xff1f;1.2 本篇博客的目标 二、投资的基本概念&#xff1a;先搞清楚“玩的是什么”2.1 二级…...

有没有适合企业用的局域网即时通讯聊天工具?

随着信息安全问题的日益凸显&#xff0c;用户对于即时通讯工具的安全性与隐私保护提出了更高的要求。 强大的即时通讯能力 BeeWorks提供了专业的IM即时通讯能力&#xff0c;支持多种消息类型&#xff0c;包括文字、语音、图片和文件等&#xff0c;满足不同场景下的沟通需求。…...

Web3技术如何提升用户数据保护

在这个信息爆炸的时代&#xff0c;用户数据保护已成为全球关注的焦点。Web3 技术&#xff0c;作为下一代互联网的代表&#xff0c;以其去中心化、安全性和用户主权等特点&#xff0c;为用户数据保护提供了新的解决方案。本文将探讨 Web3 技术如何提升用户数据保护。 去中心化存…...

CANoe自动化测试用例log保存(专栏:车载网络诊断测试攻略从零开始搭建一个UDS诊断自动化测试CANoe工程)

文章目录 前言实现思路以及对应的CAPL代码1.获取cfg工程路径2.获取系统时间3.html报告路径4.log路径5.保存报告6.用例示例在汽车电子系统的开发与测试中,CANoe作为主流的仿真测试工具,其自动化测试用例生成的Log是问题追溯、合规审计和数据分析的核心依据。然而,许多团队因日…...

理解 results = model(source, stream=True) 的工作原理和优势

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;当处理视频或图像序列时&#xff0c;streamTrue 会将结果包装成一个 生成器&#xff08;Generator&#xff09;&#xff0c;逐帧生成 Results 对象&#xff0c;而不是一次性返回所有结果。内存优化&#xff1a;…...

# 手写数字识别:使用PyTorch构建MNIST分类器

手写数字识别&#xff1a;使用PyTorch构建MNIST分类器 在这篇文章中&#xff0c;我将引导你通过使用PyTorch框架构建一个简单的神经网络模型&#xff0c;用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集&#xff0c;包含了60,000张训练图像和10,000张…...

ios app的ipa文件提交最简单的方法

ipa文件是ios的app打包后生成的二级制文件&#xff0c;在上架app store connect或做testflight测试的时候&#xff0c;它提示我们需要使用xcode、transporter或xcode命令行等方式来上传。 而xcode、transporter或xcode命令行的安装都需要使用mac电脑&#xff0c;假如没有mac电…...

与/或形演绎推理——基于王永庆著《人工智能原理与方法》的深度解析

前文&#xff0c;我们已经写了两种演绎推理&#xff1a;自然演绎推理和归结演绎推理。 自然演绎推理&#xff1a;自然演绎推理——基于王永庆著《人工智能原理与方法》的深度解析-CSDN博客 归结演绎推理&#xff1a;归结演绎推理——基于王永庆著《人工智能原理与方法》的深度…...

【Qt】Qt 按钮控件详解,PushButton,RadioButton,CheckBox,ToolButton

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;QT 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;按钮类控件&#x1f351;Push Button &#x1f965;Radio Buttion&#x1f343;click, press, release, toggled 的区别&#x1f341;…...

跨平台开发选Java还是C?应用场景与性能深度对比

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机技术快速发展的今天&#xff0c;跨平台开发已经成为众多开发者的核心需求。Java和C作为两种历史悠…...

Node.js 的定义、用途、安装方法

关于 Node.js 的定义、用途、安装方法&#xff0c;以及为什么不能使用 DOM、BOM 和与浏览器不同的顶级对象的简明总结&#xff1a; &#x1f4a1; 一、Node.js 的定义 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;它让 JavaScript 不再局限于浏览…...

5、Props:组件间的密语——React 19 数据传递全解

一、密语启封&#xff1a;咒语学徒的困惑 "教授&#xff0c;我的魔法傀儡为什么总是不听指令&#xff1f;"年轻的学徒举着发光的魔杖&#xff0c;组件树中的傀儡们却像打人柳一样混乱。"记住&#xff0c;艾薇&#xff0c;"赫敏的魔杖在空中划出金色数据流…...

LangGraph中预构件,creat_react_agent的实现流程

LangGraph Prebuilt Agent 流程图 本文档展示了LangGraph的prebuilt模块中Agent的实现流程&#xff0c;重点是create_react_agent函数构建的代理系统流程和结构。 ReAct Agent构建流程 #mermaid-svg-ubcEEuBeApApT624 {font-family:"trebuchet ms",verdana,arial,s…...

python-将文本生成音频

将文本生成音频通常需要结合 文本转语音&#xff08;TTS&#xff0c;Text-to-Speech&#xff09; 工具或库来实现&#xff0c;比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...

【虚幻C++笔记】接口

目录 概述创建接口 概述 简单的说&#xff0c;接口提供一组公共的方法&#xff0c;不同的对象中继承这些方法后可以有不同的具体实现。任何使用接口的类都必须实现这些接口。实现解耦解决多继承的问题 创建接口 // Fill out your copyright notice in the Description page o…...

白酒制造主数据管理全链路解析:业务重塑与AI赋能

作为中国消费领域的支柱产业之一&#xff0c;白酒行业在消费升级、渠道多元化的浪潮下&#xff0c;企业正面临库存积压、串货乱价、质量追溯难等核心痛点。如何通过主数据管理实现业务全链路的标准化与智能化&#xff0c;已成为行业数字化转型的关键命题。 01政策背景与行业现…...

Java与C在典型场景下的性能对比深度剖析

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机编程领域&#xff0c;Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…...

基于springboot+vue的数码产品抢购系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 系统首页 商品信…...

芯片封装制造技术分析

封装技术正由单一防护功能向集成化系统发展&#xff0c;核心需统筹电气参数、热耗散能力与生产成本之间的关系。 一、技术定义与基础功能 芯片封装指通过特定制程将半导体晶片封装于保护结构内的技术&#xff0c;核心作用包括&#xff1a; 环境隔离&#xff1a;阻隔机械冲击、…...

Linux:Makefile

编译器gcc 使用方式&#xff1a;gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤&#xff1a; 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...

下篇:《高阶排序算法:分治思想与性能突破》

个人主页&#xff1a;strive-debug 1. 堆排序&#xff08;Heap Sort&#xff09; - **核心思想**&#xff1a;利用 **大根堆&#xff08;升序&#xff09;** 或 **小根堆&#xff08;降序&#xff09;** 进行选择排序。 - **关键步骤**&#xff1a; 1. **建堆**&#xff08;…...

5G时代,视频分析设备平台EasyCVR实现通信基站远程安全便捷管控

一、背景介绍 随着移动通信行业的快速发展&#xff0c;各大运营商不断建设越来越多的无人值守通信基站。这些基站大多位于偏远地区&#xff0c;人烟稀少且交通不便&#xff0c;给日常维护带来了许多不便。特别是安装在空旷地带的基站设备&#xff0c;如空调、蓄电池等&#xf…...

第 4 篇:Motion 拖拽与手势动画(交互篇)—— 打造直觉化交互体验

Framer Motion 的拖拽与手势系统让实现复杂交互变得异常简单。本文将深入解析核心 API&#xff0c;并通过实战案例演示如何创造自然流畅的交互体验。 &#x1f9f2; 拖拽动画基础 1. 启用拖拽 使用 drag 属性即可开启拖拽能力。支持的值有&#xff1a;true&#xff08;全方向…...

TDengine 语言连接器(R语言)

简介 R 语言是一种用于统计分析、绘图和数据挖掘的编程语言和软件环境 。 TDengine 支持 R 语言访问 TDengine 数据库&#xff0c;通过 R 语言中的 RJDBC 库可以使 R 语言程序支持访问 TDengine 数据。 以下是安装过程、配置过程以及 R 语言示例代码。 安装过程 在开始之前&…...

Vue Router(3)- 历史记录模式、路由元信息

历史记录模式 Vue Router 支持多种历史管理模式&#xff0c;主要区别在于 URL 的表现形式和页面刷新/直接访问时的处理方式。 如果需要最好的兼容性或没有服务器配置权限&#xff0c;使用 Hash 模式 如果需要干净的 URL 并能配置服务器&#xff0c;使用 History 模式&#xff…...

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…...

TDengine 3.3.6.3 虚拟表简单验证

涛思新出的版本提供虚拟表功能&#xff0c;完美解决了多值窄表查询时需要写程序把窄表变成宽表的处理过程&#xff0c;更加优雅。 超级表定义如下&#xff1a; CREATE STABLE st01 (ts TIMESTAMP,v0 INT,v1 BIGINT,v2 FLOAT,v3 BOOL) TAGS (device VARCHAR(32),vtype VARCHAR(…...