我有麻烦检索Firestore getdocument数据的前景载荷。 我知道这回值从多个检查,并有可能是一个问题与我怎么处理异功能。
我的三个变量那我试图设置的。
@Published var numParticipants = 0
@Published var totalAnswered = 0
@Published var showResults = false
这是第一个功能,获取和集参与者的数量变量。
func getRoom(roomId: String, onSuccess: @escaping(_ room: Room) -> Void) {
DB.collection("Rooms").document(roomId).addSnapshotListener { document, error in
DispatchQueue.main.async {
if let dict = document?.data() {
guard let decodeRoom = try? Room.init(fromDictionary: dict) else { return }
onSuccess(decodeRoom)
}
}
}
}
这第二个函数,获取和设置的总变量回答
func getNumParticipants(roomId: String, onSuccess: @escaping(_ numParticipants: Int) -> Void) {
DB.collection("RoomsParticipants").document(roomId).collection("Participants").getDocuments { snapshot, error in
DispatchQueue.main.async {
if let error = error {
print(error.localizedDescription)
return
} else {
onSuccess(snapshot!.count)
}
}
}
}
然后我用这个最后的功能,以比较这两个变量和载荷的看法,如果他们是平等的,否则只是等待,直到他们是平等的。
func checkShowResults(roomId: String) {
isLoading = true
self.getNumParticipants(roomId: roomId) { numParticipants in
print("Number of docs: \(numParticipants)")
DispatchQueue.main.async {
self.numParticipants = numParticipants
}
}
self.getRoom(roomId: roomId) { room in
print("Total answered: \(room.totalAnswered)")
DispatchQueue.main.async {
self.totalAnswered = room.totalAnswered
if self.totalAnswered == self.numParticipants {
self.showResults = true
}
}
}
isLoading = false
}
这里是结果认为,我试图显示基于牵强的数据。
struct ResultsView: View {
@StateObject var resultsViewModel = ResultsViewModel()
var roomId: String
var body: some View {
VStack {
if !resultsViewModel.showResults {
VStack {
ProgressView()
Text("Waiting for all participants \nto finish answering...")
}
} else {
ShowResultsView()
}
}
}
}.navigationBarHidden(true)
.onAppear {
resultsViewModel.checkShowResults(roomId: roomId)
}
}
即使totalAnswered和numParticipants都是平等的时查看最初显示,showResults总是落到错误的。 但是,当数据的变化,它最终被设定为真的如果他们成为平等的。 我认为这是因为API调到火力地堡/firestore是把时间和变量不设置前景载荷。 我真的不想使用异步/等待。