Ios SwiftUI变量:willSet,didSet
我在SwiftUI应用程序中有这样的代码:Ios SwiftUI变量:willSet,didSet,ios,swift,swiftui,Ios,Swift,Swiftui,我在SwiftUI应用程序中有这样的代码: @Published var myFlag = false { willSet { ... useful code ... objectWillChange.send() } } 它或多或少能起作用,但为了确切地得到我需要的东西,我想要这样的东西: @Published var myFlag = false { didSet { ... useful code ...
@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
@Published
当属性位于willSet
如果您希望在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属性,就会自动调用
objectDidChange.send()
,因此您的代码至少是多余的(甚至可能是有害的)。你想用这些代码做什么?你能给客户看一下这个可观测的物体吗?或者,更好的,完整的可测试快照?@Asperi;我需要能够做一些辅助处理(即…有用的代码…),就像我在willSet中做的那样。但是我也希望在值更新之后而不是之前发送更新信号。如果我只是从willSet中删除objectWillChange.send()。这行得通吗?我想尝试一下,但如果我删除ContentView.swift中的“@Published”代码,“.onReceive(self.appState.$myFlag)”将不再有效。我得到了这个错误:“表达式类型'(,“@escaping”(.Output)->Void)->some View'在没有更多上下文的情况下是不明确的”我在代码中举例说明了如何使用onReceive。此外,如果您需要完成更具体的工作,请使用MVVM。保持视图远离函数,ViewModel将完成所有工作。