SwiftUI中的@StateObject和@ObservedObject的区别
SwiftUI中的@StateObject和@ObservedObject属性包装器指示视图更新以响应被观察对象的变化。虽然这两个属性包装器看起来很相似,但在使用SwiftUI构建应用程序时,有一个关键的区别需要理解。
两个属性包装器都要求对象符合ObservableObject协议。这个协议表明在对象改变之前有发布者(@Published变量)通知SwiftUI触发视图的重绘。
@StateObject的介绍和使用
@StateObject属性包装器与其他属性包装器不同,@StateObject负责创建和管理包装对象的生命周期,与@StateObject相关联的对象在拥有它的视图的生命周期内持续存在。
在一下两种情况下,应该使用@StateObject属性包装器:
- 初始化一次
- 由视图拥有的属性
初始化一次:当由于外部数据更改或重绘操作而重新计算绘制视图主体时,用@StateObject包装的属性不受影响。
属于视图:数据的生命周期与视图的生命周期相关联。一旦拥有数据的视图被释放,数据就会被释放。
在使用的时候也是比较简单的,如下:
import SwiftUIstruct VideosView: View {@StateObject private var viewModel = VideoViewModel()var body: some View {List(viewModel.notes, id: \.self) { video inText(video.title)}}
}final class VideoViewModel: ObservableObject {@Published private(set) var videos: [Video] = []
}
@StateObject属性包装器包装后的对象只初始化一次,并在视图更新期间持续存在。不过@StateObject属性包装器只能与引用类型一起使用,因为只有引用类型才能符合ObservableObject协议。
@ObservedObject的介绍和使用
上面了解了@StateObject属性包装器在拥有和管理SwiftUI视图中的数据方面起着重要的作用。不过,并不是每一块数据都需要或应该由显示它的视图拥有。这就是@ObservedObject属性包装器发挥作用的地方。与@StateObject不同的是,@ObservedObject被设计成在不获取所有权的情况下观察和响应引用类型的变化。
@ObservedObject并不拥有或管理它所观察对象的生命周期。它只是监听observable对象中的变化,并触发视图的更新。
如果数据是外部的,则选择@ObservedObject属性包装器。
如果视图需要显示由外部源(如父视图或共享数据存储)拥有和管理的数据,则选择@ObservedObject属性包装器。
使用的时候不需要初始化viewModel,而是由外部传入。
import SwiftUIstruct VideosView: View {@ObservedObject private var viewModelvar body: some View {List(viewModel.notes, id: \.self) { video inText(video.title)}}
}final class VideoViewModel: ObservableObject {@Published private(set) var videos: [Video] = []
}
使用@ObservedObject而不是@StateObject,因为视图不会创建和管理VideoViewModel。当视图被释放时,VideoViewModel不应该被释放。
如果发生外部数据更改,@ObservedObject属性包装器允许视图更新其主体。它使得在视图之间共享数据变得更加容易。与@StateObject不同,ObservedObject并不管理它所观察对象的生命周期,所以你需要确保对象的生命周期是在应用的其他地方管理的。
总结
@StateObject和@ObservedObject有相似的特性,但是它们在SwiftUI如何管理它们的生命周期方面有所不同。当当前视图创建观察对象时,使用@StateObject属性包装器确保结果一致。当注入一个被观察对象作为依赖时,使用@ObservedObject。
相关文章:
SwiftUI中的@StateObject和@ObservedObject的区别
SwiftUI中的StateObject和ObservedObject属性包装器指示视图更新以响应被观察对象的变化。虽然这两个属性包装器看起来很相似,但在使用SwiftUI构建应用程序时,有一个关键的区别需要理解。 两个属性包装器都要求对象符合ObservableObject协议。这个协议表…...
类与对象(二)
封装 封装作为面向对象三大特性(封装,继承,多态)之一,那如何实现封装性的呢?就又得拿出上面的访问修饰限定符的图 public: 就是在任何地方都可以访问 protected: 涉及子类在介绍继承时详细介绍 default: …...
LeetCode/NowCoder-链表经典算法OJ练习2
最好的,不一定是最合适的;最合适的,才是真正最好的。💓💓💓 目录 说在前面 题目一:分割链表 题目二:环形链表的约瑟夫问题 SUMUP结尾 说在前面 dear朋友们大家好!&…...
英伟达解码性能NVDEC
如果你能打开官网,请看这里: NVDEC Application Note 下面是摘录:...
文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题
一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码,请用go语言。 文心一言: 首先,让我们明确一点:由于您没有提供具体的图18-8(f)的内容,我只能假设它是一个数据结构(可能是图、树或列表等&…...
C++ | Leetcode C++题解之第73题矩阵置零
题目: 题解: class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int m matrix.size();int n matrix[0].size();int flag_col0 false;for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col0 true;}for …...
用 Supabase CLI 进行本地开发环境搭建
文章目录 (零)前言(一)Supabase CLI(1.1)安装 Scoop(1.2)用 Scoop 安装 Supabase CLI (二)本地项目环境(2.1)初始化项目(2…...
三极管 导通条件
一、三极管理解 三极管是电子行业常用的元器件之一,他是一种电流型控制的器件,他有三种工作状态:截止区,放大区、饱和区。当三极管当做开关使用时,他工作在饱和区。下面简短讲解三极管作为开关使用的方法,只…...
一次pytorch分布式训练精度调试过程
现象: loss不下降 过程如下: 1.减少层数,准备最小复现环境 2.dropout设置为0,重复运行二次,对比loss是否一致 3.第二次迭代开始loss不一致 4.对比backward之后的梯度,发现某一个梯度不一致 5.dump得到所有算子的规模,单算子测试…...
STM32(GPIO)
GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电…...
python设计模式---观察者模式
观察者模式是一种行为设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…...
【论文笔记】KAN: Kolmogorov-Arnold Networks 全新神经网络架构KAN,MLP的潜在替代者
KAN: Kolmogorov-Arnold Networks code:https://github.com/KindXiaoming/pykan Background 多层感知机(MLP)是机器学习中拟合非线性函数的默认模型,在众多深度学习模型中被广泛的应用。但MLP存在很多明显的缺点:…...
【投稿资讯】区块链会议CCF C -- CoopIS 2024 截止7.10 附录用率
会议名称:CoopIS CCF等级:CCF C类学术会议 类别:人机交互与普适计算 录用率:2023年接收率21% (21 regular 10 work-in-progress papers/100) AREA 5: HUMAN-CENTRIC SECURITY AND PRIVACY IN INFORMATION SYSTEMS Access Con…...
React Native 之 开发环境搭建(一)
1. 安装Node.js: Node.js是React Native开发的基础,因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS (长期维护)版本,一般是偶数版本,不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…...
DS高阶:B树系列
一、常见的搜索结构 1、顺序查找 时间复杂度:O(N) 2、二分查找 时间复杂度:O(logN) 要求:(1)有序 (2)支持下标的随机访问 3、二叉搜索树(BS树) 时间复杂…...
第五百零三回
文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容,本章回中将介绍使用get进行路由管理.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…...
[动态规划] 完美覆盖
描述 一张普通的国际象棋棋盘,它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格,即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么,是否能够把 32 张多米诺牌摆放…...
redis深入理解之实战
1、SpringBoot整合redis 1.1 导入相关依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId&g…...
python设计模式---工厂模式
定义了一个抽象类Animal,并且让具体的动物类(Dog、Cat、Duck)继承自它,并实现了speak方法。然后创建了AnimalFactory工厂类,根据传入的参数来决定创建哪种动物的实例。 from abc import abstractmethod, ABCclass Anim…...
探索Vue 3.0中的v-html指令
探索Vue 3.0中的v-html指令 一、什么是v-html指令?1、 在Vue 3.0中使用v-html2、 注意事项 二、结语 一、什么是v-html指令? Vue.js作为一款流行的JavaScript框架,不断地演进着。随着Vue 3.0的发布,开发者们迎来了更加强大和灵活…...
Visual Studio Code搭建c语言编译环境下载c/c++ Runner插件编译报错问题
安装版本默认是最新插件。下载如果无法编译就换版本。最后换到1.5.5版本就编译成功了。耗时2小时解决无法编译报错。process_begin: CreateProcess(NULL, ./build\Debug/outDebug "", ...) failed. make (e2): 系统找不到指定的文件。...
G-Helper终极指南:如何彻底解决华硕笔记本散热与性能管理难题
G-Helper终极指南:如何彻底解决华硕笔记本散热与性能管理难题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenb…...
Flink窗口实战避坑指南:从AggregateFunction到ProcessWindowFunction,我踩过的那些坑
Flink窗口实战避坑指南:从AggregateFunction到ProcessWindowFunction的深度解析 第一次在真实项目中使用Flink窗口时,我像发现新大陆一样兴奋。直到凌晨三点被报警短信惊醒,才发现窗口计算的结果完全偏离预期——这让我意识到,窗口…...
告别Python依赖!手把手教你用C++复现Librosa的Mel频谱和MFCC特征提取
高性能C音频特征提取实战:从Librosa原理到嵌入式部署优化 在语音识别和音频分析领域,Mel频谱和MFCC特征提取是基础但关键的技术环节。许多开发者习惯使用Python的Librosa库快速实现原型,但当需要部署到生产环境时,Python的解释器性…...
5大优势解析:如何高效使用免费离线OCR工具
5大优势解析:如何高效使用免费离线OCR工具 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 项目…...
Excel MCP Server终极指南:3步实现无界面Excel自动化处理
Excel MCP Server终极指南:3步实现无界面Excel自动化处理 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server 你是否厌倦了手动操作Excel的繁琐…...
NVIDIA Profile Inspector终极显卡优化工具:简单易用的性能调校完整指南
NVIDIA Profile Inspector终极显卡优化工具:简单易用的性能调校完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡优化工具,专为…...
3分钟掌握猫抓扩展:轻松捕获网页视频的终极秘籍
3分钟掌握猫抓扩展:轻松捕获网页视频的终极秘籍 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过这样的情况࿱…...
Python与ChatGPT构建智能办公自动化:从任务分解到智能体系统
1. 项目概述:用Python与ChatGPT联手,让办公自动化“开口说话”如果你每天还在重复着打开Excel、复制粘贴数据、手动写邮件、整理报告这些枯燥的活儿,那这个项目可能就是你的“数字员工”入职通知书。Sven-Bo/automate-office-tasks-using-cha…...
DIY便携FPV地面站:从电路设计到3D打印的完整制作指南
1. 项目概述:为什么需要一个便携式FPV地面站?玩FPV(第一人称视角)飞行,无论是竞速穿越还是航拍探索,最核心的体验就是那块屏幕。大多数飞手依赖FPV眼镜带来的沉浸感,但在很多场景下,…...
