- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 SwiftUI View
绑定(bind)到 ObservableObject
时,当被观察对象发生任何变化时, View 会自动重新加载 - 无论是否更改直接影响 View 。
这似乎会给非平凡的应用程序带来严重的性能问题。看这个简单的例子:
// Our observed model
class User: ObservableObject {
@Published var name = "Bob"
@Published var imageResource = "IMAGE_RESOURCE"
}
// Name view
struct NameView: View {
@EnvironmentObject var user: User
var body: some View {
print("Redrawing name")
return TextField("Name", text: $user.name)
}
}
// Image view - elsewhere in the app
struct ImageView: View {
@EnvironmentObject var user: User
var body: some View {
print("Redrawing image")
return Image(user.imageResource)
}
}
这里我们有两个不相关的 View ,位于应用程序的不同部分。他们都观察到环境提供的共享 User
的变化。 NameView
允许您通过 TextField 编辑 User
的名称。 ImageView
显示用户的个人资料图片。
问题:NameView
中的每次击键,观察此User
的所有 View 都被迫重新加载它们的 View 整个正文内容。这包括 ImageView
,它可能涉及一些昂贵的操作 - 例如下载大图像/调整大图像的大小。
这在上面的示例中很容易证明,因为每次在 TextField 中输入新字符时,都会记录 "Redrawing name"
和 "Redrawing image"
。
问题:我们如何改进 Observable/Environment 对象的使用,以避免不必要的 View 重绘?有没有更好的方法来构建我们的数据模型?
为了更好地说明为什么这会成为一个问题,假设 ImageView
不仅仅显示静态图像。例如,它可能:
init
或 onAppear
方法触发还有很多例子,但这些是我在当前项目中遇到的。在每一种情况下,重新计算 View 的 body
都会导致丢弃状态和一些昂贵的操作被取消/重新启动。
并不是说这是 SwiftUI 中的“错误”——但如果有更好的方法来构建我们的应用程序,我还没有看到 Apple 或任何教程提到过它。大多数示例似乎都倾向于在不解决副作用的情况下自由使用 EnvironmentObject。
最佳答案
为什么 ImageView
需要整个 User
对象?
回答:不是。
将其更改为仅获取所需的内容:
struct ImageView: View {
var imageName: String
var body: some View {
print("Redrawing image")
return Image(imageName)
}
}
struct ContentView: View {
@EnvironmentObject var user: User
var body: some View {
VStack {
NameView()
ImageView(imageName: user.imageResource)
}
}
}
当我点击键盘键时输出:
Redrawing name
Redrawing image
Redrawing name
Redrawing name
Redrawing name
Redrawing name
关于ios - SwiftUI - ObservableObject 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59039475/
我有一个名为 PurchaseView 的 View .此 View 显示有关购买、购买的内容和购买者的详细信息。我正在做的是,在这个 View 中,我同时放置了 ItemView和 ClientVi
public typealias ObservableObject = ObservableObject 为什么这个看似毫无意义的类型别名在这里? 最佳答案 您可以在 swift-corelibs-f
我有一个可以保存图像的游戏对象。每当找到游戏的图像 URL 时,就应该创建一个新的 GameImage 对象实例。然后它将获取图像并填充 UIImage 属性。发生这种情况时,应更新 UI 以显示图像
使用 SwiftUI 我想按下一个按钮并让它切换用于过滤图像的类。 在 SwiftUI 中,按钮会执行如下操作: @ObservedObject var currentFilter = FilterC
问题 为了实现应用程序代码的简洁外观,我为每个包含逻辑的 View 创建了 ViewModel。 一个普通的 ViewModel 看起来有点像这样: class SomeViewModel: Obse
我有一个设置为 ObservableObject 的类: class MatchData : Identifiable, ObservableObject { @Published
好的,SwiftUI 和 ObservableObject,在 iOS 13 上。我有 Model 实现了 ObservableObject: class Model: ObservableObjec
我有一个类Foo对 ObservableObject 具有多个依赖项.出于测试目的,我想创建这些对象的模拟版本,但我看不到这样做的方法,然后将它们注入(inject) Foo . 我无法创建另一个协议
我想在 SwiftUI 中有一个可选的 @ObservedObject 但我一直收到编译时错误。 Property type 'AModel?' does not match that of the
我有一个 ObservableObject class CurrentPosition: ObservableObject { @Published var northEast = CLLoc
我在 View 中创建了一个 ObservableObject。 @ObservedObject var selectionModel = FilterSelectionModel() 我在 Filt
class Group: ObservableObject { @Published var size: CGFloat = 22 } struct content: View { @
我对 SwiftUI 很陌生(而且我也有一段时间没有接触过 Swift)所以请耐心等待: 我有这样的看法: import SwiftUI import Combine var settings = U
当 SwiftUI View 绑定(bind)到 ObservableObject 时,当被观察对象发生任何变化时, View 会自动重新加载 - 无论是否更改直接影响 View 。 这似乎会给非平凡
我想在 ObservableObject 中导入一个实际的变量集: 我的代码是: import SwiftUI struct HomepageView: View { @ObservedOb
请帮助我理解 MVVM 模式中的一件事: 例如,我需要在 map 上显示城市。在 ViewModel 中,我有 ObservableCollection,它绑定(bind)到 View ItemsSo
我在我的 DateView 中有一个这样声明的 ObservableObject: import SwiftUI class SelectedDate: ObservableObject {
我尝试使 NWPathMonitor 成为一个可观察对象,如果有网络连接则返回 true,否则返回 false。 你能帮我吗,因为我的解决方案不起作用。 谢谢 import Foundation im
我正在尝试学习与 SwiftUI 结合,我正在努力如何使用 ObservableObject 更新我的 View (来自 UIKit) (以前的 BindableObject )。显然,问题是方法 u
我有一个 SwiftUI 项目和一个绑定(bind)到 EnvironmentObject 的 View 。该对象包含一个@Published 属性。 import Foundation class
我是一名优秀的程序员,十分优秀!