ObservedObject 更改时的通知

Tal*_*ode 4 sprite-kit swift swiftui observedobject observableobject

我有一个由几个 SwiftUI 组件组成的图形用户界面(我们称它们为子视图)。这些子视图在 ObservableObject / ObservedObject 的帮助下相互通信。当一个视图发生更改时,另一个视图会自动收到通知并自行更新。

然而,其中一个子视图不是 SwiftUI 视图,而是 SpriteKit SKScene。在这里,我也想对观察值的变化做出反应。但我没有自动更新的视图。我想根据观察到的值对精灵进行调整。

我如何得知价值的变化?我可以在 ObservedObject 的值发生变化时立即调用方法吗?

Alb*_*tUI 10

从 UIKit 或 SKScene 中很容易观察 ObservedObject 的变化。下面的示例来自 UIViewController,将其更改为与 SKScene 等效:

\n
import Combine\n\nclass Object: ObservableObject {\xc2\xa0\n    @Published var value: Int = 10\n    @Published var anotherValue: String = "Hello"\n}\n\nclass MyViewController: UIViewController {\xc2\xa0\n\n    let observedObject = Object()\n    var cancellableBag = Set<AnyCancellable>()\n\n    override func viewDidLoad() {\xc2\xa0\n        super.viewDidLoad()\n\n        // REACT TO ANY @PUBLISHED VARIABLE\n        observedObject.objectWillChange.sink {\xc2\xa0\n              // Do what you want here\n        }.store(in: &cancellableBag)\n\n        // REACT ONLY TO ONE SPECIFIED @PUBLISHED VARIABLE\n        observedObject.$value.sink {\xc2\xa0value in\n              // Do what you want here\n        }.store(in: &cancellableBag)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,这@Published是一个propertyWrapperwith projectedValue。在本projectedValue例中, 是Publisher, 每次wrappedValue更改时都会发出事件,因此为了访问 ,projectedValue有必要调用$value而不是value

\n

  • 另请注意,该发布者是在值被更改(即 objectWillChange)之前**发出的。如果您尝试通过 ObservableObject 访问属性的值,它仍然具有旧值。 (2认同)