首页 > 解决方案 > 类 --> 结构时 swiftUI+Combine 中的奇怪行为

问题描述

在 youtube 视频教程中,有一件事引起了我的注意。为了重现它,我创建了一个非常简单的项目。我知道代码的设计并不完美,但我想知道为什么代码在这种特殊情况下会这样。

文件 #1

import SwiftUI

struct ContentView: View {

    @ObservedObject var viewModel = ViewModel()

    var body: some View {
        Text(viewModel.content).onAppear() {
            self.viewModel.subsribe()
        }
    }
}

文件 #2

import Combine

class ViewModel: ObservableObject {

    private let model = Model()
    @Published var content: String = ""
    var subscription: AnyCancellable?

    func subsribe() {
        subscription = model.getPublisher().sink { value in
            self.content = value
        }
    }
}

文件 #3

import Foundation
import Combine

class Model {

    func getPublisher() -> AnyPublisher<String, Never> {
        Just("Test")
            .receive(on: DispatchQueue.main)
            .eraseToAnyPublisher()
    }
}

在这段代码中,一切都按预期工作。但是如果在文件 #3 中class Model更改为struct Model它会停止工作!
很奇怪,因为……好像没什么区别。

提示 #1
事实上,我们仍然从发布者那里得到消息。但是视图不会更新它。

提示 #2
如果我们稍微更改文件 #2 中的代码

private let publisher = Model().getPublisher()

func subsribe() {
    subscription = publisher.sink { value in
        self.content = value
    }
}

它适用于两种情况(withclass和 with struct

提示 #3(由于@Sweeper 的评论而编辑)
在文件 #2 中,如果我们将代码行private let model = Model()移动到底部,如下所示:

    class ViewModel: ObservableObject {

        @Published var content: String = ""
        var subscription: AnyCancellable?
        private let model = Model()

        func subsribe() {
            subscription = model.getPublisher().sink { value in
                self.content = value
            }
        }
    }

代码开始工作!!!
其他人可以重现这种行为吗?

PS
链接原视频教程:视频

标签: swiftswiftuicombine

解决方案


推荐阅读