ObservationExtras 是一个库,为 Swift Observation 框架添加了一些功能。 这些工具主要旨在简化 Observation 与 UIKit 结合使用的过程。
目前有两个宏可用于实现基本功能。
@Observing 宏允许你将你的类标记为正在观察。 这个宏与 @Observable 宏配合使用。 当你将 ViewModel 标记为 @Observable 时,你将接收者标记为 @Observing。 在实际应用场景中,它看起来会像这样:
@Observable
final class ViewModel {}
@Observing
final class ViewController: UIViewController {
let viewModel = ViewModel()
}
此外,我们需要以某种方式通知系统开始观察状态更改。 这可以通过在入口点调用生成的 observeState() 方法来实现,通常在使用 ViewControllers 时,在 viewDidLoad 事件中调用。 未来,可能会实现此过程的自动化。 相关的开发可以在 experimental/observing-view-controller 分支中查看。
@observeState 宏允许你指定哪个函数访问状态,并在状态更改时再次调用。 这允许你根据需要对状态更新进行细粒度控制,因为只有当函数访问给定的状态片段时,该函数才会被再次调用,而不是在任何状态更改时都调用。
示例场景
@Observable
final class ViewModel {
var isButtonHidden = false
var buttonText = "Press me
}
@Observing
final class ViewController: UIViewController {
let viewModel = ViewModel()
let button = UIButton()
@observableState
private func setupButtonState() {
button.isHidden = viewModel.isButtonHidden
button.setTitle(viewModel.buttonText, for: .normal)
}
}
在这种场景中,如果任何访问的变量发生更改,整个 setupButtonState()
函数都会被调用。 但是,如果我们这样做:
@Observable
final class ViewModel {
var isButtonHidden = false
var buttonText = "Press me
}
@Observing
final class ViewController: UIViewController {
let viewModel = ViewModel()
let button = UIButton()
@observableState
private func setupButtonVisibilityState() {
button.isHidden = viewModel.isButtonHidden
}
@observeState
private func setupButtonTitle() {
button.setTitle(viewModel.buttonText, for: .normal)
}
}
在这里,只有访问变量的函数会在变量更改时被调用。