objectWillChange.send() 究竟是如何工作的?

Tom*_*m S 0 swift swiftui

func choose(_ card: MemoryGame<String>.Card)
    {
        objectWillChange.send()
        model.choose(card)
    }
Run Code Online (Sandbox Code Playgroud)

我这里有一些函数,它位于 ViewModel 中,用于我正在制作的东西,我只是想知道 objectWillChange 到底是如何工作的?就像当它说对象时它到底指的是什么?既然我把它放在 ViewModel 中,是不是说 ViewModel 会改变?但话又说回来,我把它专门放入这个选择函数中,那么这有什么相关性呢?我基本上希望它发布模型中的某些更改(选择了一张卡),它似乎正在做,但我不完全理解我之前所说的内容。

Dáv*_*tor 9

objectWillChange是协议上定义的属性,您可以在ObservableObject 的文档ObservableObject中看到。

编译器合成该属性的默认实现,每当@Published对象的任何属性发生更改时,该实现都会发出一个值。

当您将对象存储为(或或) 视图上时,SwiftUI 使用objectWillChange Publisher来更新。View@ObservedObject@StateObject@EnvironmentObject

当您需要手动更新视图时,您还可以通过objectWillChange使用其方法手动发送更新。send()

请参阅下面的简化示例:

class ViewModel: ObservableObject {
    @Published var published: Int = 0
    var nonPublished: Int = 0
}

struct MyView: View {
    @ObservedObject var viewModel: ViewModel
    ...
}

let viewModel = ViewModel()
let view = MyView(viewModel: viewModel)
viewModel.published = 1 // viewModel.objectWillChange emits a value here and view will be updated
viewModel.nonPublished = 2 // viewModel.objectWillChange does not emit a value here and view will not be updated
Run Code Online (Sandbox Code Playgroud)