Firebase同步请求未调用状态变量更改,SwiftUI
我保持firebase请求同步以从db中检索值(值由后端更改) 当值更改时,调用firebase请求,更改计数值,但不调用onChange(由于swift比较引用的事实?)。下面是带有OO的代码。从swiftui的角度来看,这是没有意义的,但这只是为了表明在使用Firebase sync请求时视图不同步(值为)Firebase同步请求未调用状态变量更改,SwiftUI,swiftui,synchronization,state,Swiftui,Synchronization,State,我保持firebase请求同步以从db中检索值(值由后端更改) 当值更改时,调用firebase请求,更改计数值,但不调用onChange(由于swift比较引用的事实?)。下面是带有OO的代码。从swiftui的角度来看,这是没有意义的,但这只是为了表明在使用Firebase sync请求时视图不同步(值为) 快照在哪里?谢谢您的评论。因为它是基于firebase请求的,因此不容易复制,所以我没有包括它。事实:奎。保持同步(对)。事实:当db中的值发生变化时,计数值会更新。网络调用可能不应该在
快照在哪里
?谢谢您的评论。因为它是基于firebase请求的,因此不容易复制,所以我没有包括它。事实:奎。保持同步(对)。事实:当db中的值发生变化时,计数值会更新。网络调用可能不应该在视图中进行,而应该在ObserveObject中进行。谢谢jnpdx。此时,我已使用OO从请求中获取更新。但是,即使调用了onReceive;将OO中的值赋给count(state var)根本不会更新视图(onChange仍然没有调用),视图也没有udpated。这是很困难的,因为必须在某一点上指定值以计算要更新的视图。通过手动(onTap),没有问题,而且,onReceive在感觉需要时被真正调用,到目前为止还不可靠
class GlobalOO: ObservableObject {
@Published var multiV :String = "0"
}
import SwiftUI
import Firebase
private var multiSelectQuery : DatabaseReference!
private var handle :DatabaseHandle!
struct SearchToolBar: View {
@ObservedObject var globalOO = GlobalOO()
var body: some View {
Text(globalOO.multiV)
.onReceive(globalOO.$multiV, perform: { _ in
print("received")
})
.onAppear{
//this pat is only to update value in the db
DispatchQueue.main.asyncAfter(deadline: .now()+3){
Global.myRef.child(Strings.dbname_states).setValue("5")
}
DispatchQueue.main.asyncAfter(deadline: .now()+6){
Global.myRef.child(Strings.dbname_states).setValue("7")
}
//
multiSelection()
}
}
private func multiSelection(){
multiSelectQuery = Global.myRef.child(Strings.dbname_states)
multiSelectQuery.keepSynced(true)
handle = multiSelectQuery.observe(.value,with :{(snapshot) in
let multiValue:String = snapshot.value! as! String
globalOO.multiV = multiValue
print("DDD",globalOO.multiV)
})
}
}