You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI订阅@Published属性的订阅者是否会自动执行removeDuplicates去重?

解答

代码会不会导致视图持续刷新?

不会,这段代码不存在无限持续刷新的问题。
onAppear回调仅会在视图首次被挂载到渲染树、对用户可见时触发一次。你在onAppear中调用foo.update()将value赋值为和当前值完全相同的1,即使触发了Foo对象的objectWillChange变更事件,SwiftUI 重新计算BarView的body之后,会比对发现Text的内容和上一次渲染结果没有任何差异,不会执行实际的视图重绘,也不会重新触发onAppear回调,因此不会出现循环刷新的情况。
补充:这种场景下最多只会多触发一次body的计算,不会有持续的性能消耗。

@Published 内部是否有内置去重逻辑?

@Published属性包装器本身提供的发布者没有内置类似removeDuplicates的去重逻辑:如果你直接订阅$value这个 Combine 发布者,哪怕给value赋值和当前完全相等的值,订阅者也会收到变更事件。
你观察到的“不会重复刷新”的效果,来自SwiftUI本身的渲染差分优化机制:当@ObservedObject监听的对象发布变更事件后,SwiftUI会先重新计算对应视图的body,再将新的body输出和上一次的渲染快照做逐节点比对,只有真正发生变化的部分才会被更新到屏幕上,没有变化的部分不会触发任何后续的生命周期回调,也不会产生额外的渲染开销。
目前苹果确实没有在公开的官方文档中明确标注这一优化逻辑,但这是SwiftUI声明式渲染体系的核心特性之一,在所有系统版本的SwiftUI实现中都存在。


内容的提问来源于stack exchange,提问作者Fogmeister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:03