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

SwiftUI中的@StateObject和@ObservedObject的区别

SwiftUI中的@StateObject和@ObservedObject属性包装器指示视图更新以响应被观察对象的变化。虽然这两个属性包装器看起来很相似,但在使用SwiftUI构建应用程序时,有一个关键的区别需要理解。

两个属性包装器都要求对象符合ObservableObject协议。这个协议表明在对象改变之前有发布者(@Published变量)通知SwiftUI触发视图的重绘。

@StateObject的介绍和使用

@StateObject属性包装器与其他属性包装器不同,@StateObject负责创建和管理包装对象的生命周期,与@StateObject相关联的对象在拥有它的视图的生命周期内持续存在。

在一下两种情况下,应该使用@StateObject属性包装器:

  1. 初始化一次
  2. 由视图拥有的属性

初始化一次:当由于外部数据更改或重绘操作而重新计算绘制视图主体时,用@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题矩阵置零

题目&#xff1a; 题解&#xff1a; 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 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…...

三极管 导通条件

一、三极管理解 三极管是电子行业常用的元器件之一&#xff0c;他是一种电流型控制的器件&#xff0c;他有三种工作状态&#xff1a;截止区&#xff0c;放大区、饱和区。当三极管当做开关使用时&#xff0c;他工作在饱和区。下面简短讲解三极管作为开关使用的方法&#xff0c;只…...

一次pytorch分布式训练精度调试过程

现象: loss不下降 过程如下: 1.减少层数&#xff0c;准备最小复现环境 2.dropout设置为0&#xff0c;重复运行二次&#xff0c;对比loss是否一致 3.第二次迭代开始loss不一致 4.对比backward之后的梯度,发现某一个梯度不一致 5.dump得到所有算子的规模&#xff0c;单算子测试…...

STM32(GPIO)

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电…...

python设计模式---观察者模式

观察者模式是一种行为设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都会得到通知并自动更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…...

【论文笔记】KAN: Kolmogorov-Arnold Networks 全新神经网络架构KAN,MLP的潜在替代者

KAN: Kolmogorov-Arnold Networks code&#xff1a;https://github.com/KindXiaoming/pykan Background ​ 多层感知机&#xff08;MLP&#xff09;是机器学习中拟合非线性函数的默认模型&#xff0c;在众多深度学习模型中被广泛的应用。但MLP存在很多明显的缺点&#xff1a;…...

【投稿资讯】区块链会议CCF C -- CoopIS 2024 截止7.10 附录用率

会议名称&#xff1a;CoopIS CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;人机交互与普适计算 录用率&#xff1a;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&#xff1a; Node.js是React Native开发的基础&#xff0c;因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS &#xff08;长期维护&#xff09;版本&#xff0c;一般是偶数版本&#xff0c;不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…...

DS高阶:B树系列

一、常见的搜索结构 1、顺序查找 时间复杂度&#xff1a;O(N) 2、二分查找 时间复杂度&#xff1a;O(logN) 要求&#xff1a;&#xff08;1&#xff09;有序 &#xff08;2&#xff09;支持下标的随机访问 3、二叉搜索树&#xff08;BS树&#xff09; 时间复杂…...

第五百零三回

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容&#xff0c;本章回中将介绍使用get进行路由管理.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…...

[动态规划] 完美覆盖

描述 一张普通的国际象棋棋盘&#xff0c;它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌&#xff0c;每张牌恰好覆盖棋盘上相邻的两个方格&#xff0c;即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么&#xff0c;是否能够把 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&#xff0c;并且让具体的动物类&#xff08;Dog、Cat、Duck&#xff09;继承自它&#xff0c;并实现了speak方法。然后创建了AnimalFactory工厂类&#xff0c;根据传入的参数来决定创建哪种动物的实例。 from abc import abstractmethod, ABCclass Anim…...

探索Vue 3.0中的v-html指令

探索Vue 3.0中的v-html指令 一、什么是v-html指令&#xff1f;1、 在Vue 3.0中使用v-html2、 注意事项 二、结语 一、什么是v-html指令&#xff1f; Vue.js作为一款流行的JavaScript框架&#xff0c;不断地演进着。随着Vue 3.0的发布&#xff0c;开发者们迎来了更加强大和灵活…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...