首页 > 解决方案 > 使用 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()
    }
}

标签: swiftui

解决方案


任何时候Foo,作为一个ObservedObject,发布一个更改,它会导致“观察”它的视图重新呈现他们的body

Foo在 中观察到ContentView,因此 中的变化Foo使其重新计算body

VStack {
    Text("\(foo.value)")
    FirstView()
}

这调用FirstView(),后者又调用Bar()


推荐阅读