ios - 我是否应该检查我是否为 @Published 属性分配了不同的值?
问题描述
我有一个简单的代码示例,其中我更新了具有相同值@State
的@Published
属性(单击按钮时)。现在我看到了,然后我将相同的值分配给@State
没有视图的主体调用。但是然后我分配给@Published
财产,然后每个分配都有调用。我知道它可能很快,但仍然可能会不必要地调用视图主体。
那么我应该检查我是否真的改变了@Published
财产的价值,还是有其他方法?
class Object: ObservableObject {
@Published var state: Bool = false
func setState() {
state = false
}
}
struct ContentView: View {
@State var state: Bool = false
@ObservedObject var obj = Object()
var body: some View {
print(Self._printChanges())
return VStack {
Text("\(String(state))")
Button("Tap") {
self.state = false
obj.setState()
}
}
}
}
点击输出(3 次):
ContentView: _obj changed.
()
ContentView: _obj changed.
()
ContentView: _obj changed.
()
解决方案
SwiftUI 是声明性的,因此可以说这种特定行为是一个实现细节,我不会担心。仅仅因为 SwiftUI 正在调用body
并不一定意味着您的 UI 正在被重绘。实际上,如果每个视图都具有相同的“身份”且数据未更改,则您无需担心额外的 SwiftUI 绘图调用。系统将知道没有任何变化,也不会产生 UI 开销。
除非您已将其明确描述为应用程序中的性能瓶颈,否则您无需为此进行修补。除非您有充分的理由,否则不要优化任何东西,否则您只是在浪费时间(因为可能首先要解决其他瓶颈)。
推荐阅读
- reactjs - 每次渲染(React,useReducer)在reducer中堆叠多个动作的更好方法是什么?
- typescript - 是否可以使用 TypeScript 从任意类创建随机对象?
- android - 如何删除导航图标菜单中的填充
- python - 在 python 数据框的特定行中加入字符串
- c - strtok() 没有读过第一个输入片段
- docker - 如何更改 Docker Windows 版本?
- python - 将 Flask 应用程序部署到 Kubernetes (GCP) 时出现导入错误
- r - lavaan - WLSMV 估计器的问题
- php - php下单成功后的库存管理
- powershell - 使用 Powershell 在 W10 中创建新的本地用户帐户但不填充前端