swiftui - 使用 Timer 时,SwiftUI 中 ObservedObject 的奇怪行为
问题描述
在下面的程序中,为每个计时器事件调用 Bar 的初始化程序。有谁知道这个问题的原因?
这个问题在模拟器和真实设备 iOS 13.5 中都会发生。我在 Xcode 11.5 上对此进行了测试。
import SwiftUI
import Combine
class Foo: ObservableObject {
@Published var value: Int
init() {
print("init")
self.value = 10
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (_) in
self.value += 1
}
}
}
class Bar: ObservableObject {
@Published var value: Int
init() {
print("Bar")
self.value = 100
}
}
struct FirstView: View {
@EnvironmentObject var foo: Foo
@ObservedObject var bar = Bar()
var body: some View {
VStack {
Text("\(foo.value)")
Text("\(bar.value)")
}
}
}
struct ContentView: View {
@EnvironmentObject var foo: Foo
var body: some View {
VStack {
Text("\(foo.value)")
FirstView()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
解决方案
任何时候Foo
,作为一个ObservedObject
,发布一个更改,它会导致“观察”它的视图重新呈现他们的body
Foo
在 中观察到ContentView
,因此 中的变化Foo
使其重新计算body
:
VStack {
Text("\(foo.value)")
FirstView()
}
这调用FirstView()
,后者又调用Bar()
。
推荐阅读
- python - 这个 PyCharm 警告对我来说没有意义
- azure - Azure Blob 存储 - 发送图像名称列表并获取图像列表
- ios - 我的天气数据没有显示在我的视图控制器中
- javascript - 如何删除数组数组中的重复项
- javascript - Fetch API 调用导致新的 Asp.net 会话
- javascript - 在 JavaScript 中将 const 转换为函数 - React
- python - python pyplot的程序化平底锅
- mysql - 如果几乎一个内部连接条件没有值,如何返回 null?
- c++ - 为什么地图会跳过第一个字符?
- arrays - 给定一个整数 0 到 N 的数组,有多少种排列方式使得 array[i] 不能是 i