【问题标题】:SwiftUI var: willSet, didSetSwiftUI 变量:willSet、didSet
【发布时间】:2020-08-16 10:50:08
【问题描述】:

我在 SwiftUI 应用中有这样的代码:

@Published var myFlag = false {
    willSet {
        ... useful code ...
        objectWillChange.send()
    }
}

它或多或少有效,但要准确地得到我需要的东西,我想要这样的东西:

@Published var myFlag = false {
    didSet {
        ... useful code ...
        objectDidChange.send()
    }
}

原因很简单,我希望在 myFlag 更新而不是之前得到通知。不过,它似乎不是这样工作的。 有没有其他方法可以得到我想要的?

除了我正在使用这个代码:

.onReceive(self.appState.$myFlag) {...}

在 ContentView.swift 中

【问题讨论】:

  • objectDidChange.send() 会在设置@Published 属性时自动调用,因此您的代码至少是多余的(甚至可能是有害的)。你想用那个代码做什么?你会展示这个可观察对象的客户吗?或者,更好的、完整的可测试快照?
  • @Asperi;我需要能够做一些辅助处理(即......有用的代码......),就像我可以在 willSet 中做的那样。但我也想在值更新之后而不是之前发送更新信号。如果我只是从 willSet 中删除 objectWillChange.send()。这行得通吗?

标签: ios swift swiftui


【解决方案1】:

@Published 在属性位于willSet 时自动发布 https://developer.apple.com/documentation/combine/published

如果您希望在didSet 期间发布,请删除@Published 并手动发布。

import SwiftUI
class ManualOObject: ObservableObject {
    var someValue: Int = 0{
        willSet{
            print("willSet - \(someValue)")
        }
        didSet{
            print("didSet - \(someValue)")
            objectWillChange.send()
        }
    }
    init() {
        for n in 0...5 {
            
            DispatchQueue.main.asyncAfter(deadline: .now() + Double(n)) {
                print("n = \(n.description)")
                            self.someValue = n
                        }
        }
    }
}
struct ManualOOView: View {
    @ObservedObject var manualOObject = ManualOObject()
    
    var body: some View {
        Text(manualOObject.someValue.description).onReceive(manualOObject.objectWillChange, perform: { _ in
            print("UI received = \(manualOObject.someValue)")
        })
    }
}

【讨论】:

  • 我想尝试,但如果我删除“@Published”,我的 ContentView.swift 中的代码:“.onReceive(self.appState.$myFlag)”不再起作用。我收到此错误:“表达式类型 '(, "@escaping" (.Output) -> Void) -> some View' is ambiguous without more context"
  • 我在代码中放了一个如何使用onReceive的例子。此外,如果您需要完成更具体的工作,请使用 MVVM。保持 View 的功能清晰,ViewModel 将完成所有工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2017-02-12
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多