![](/img/trans.png)
[英]Swift - Problem While Downloading Data From Firebase Firestore Asynchronously with DispatchGroup()
[英]How to enter a DispatchGroup in a firebase firestore callback
我有這個 function 我想在其中播放 animation 直到我的數據獲取完成。 我有這個變量“loadFetchDone”來表明這一點。 當我從 firebase 獲取數據時,我需要使用 snapshotListener。
func getLoads(completion: @escaping () -> ()){
bookedLoadsListener = db.collectionGroup("allLoads").whereField("cv", isEqualTo: 1).whereField("status", isEqualTo: "Booked").order(by: "DateBooked", descending: false).addSnapshotListener{ (snapshot, err) in
if err != nil{print("Error getting docs in TruckTrackingView.swift: \(err)")}
loadFetchDone = false
loads = []
let lGroup = DispatchGroup()
for load in snapshot?.documents ?? []{
lGroup.enter()
...
lGroup.leave()
}
}
}
lGroup.notify(queue: .main){
completion()
}
}
}
我用這個 function 來獲取負載。 完成后,我將 loadFetchDone 設置為 true,然后停止加載 animation。這就是我調用 function 的方式
.onAppear(){
globalGroup.enter()
getLoads {
globalGroup.leave()
}
globalGroup.notify(queue: .main){
loadFetchDone = true
}
}
如果這是一個普通的 getDocuments 調用,那么不會有問題,但由於我使用的是 snapshotListeners,如果對文檔進行了更改,則永遠不會輸入 globalGroup。 然后這會導致 EXC BAD INSTRUCTION,因為我沒有進入該組就離開了該組。 我嘗試在 snapshotListener 中輸入組,但它從不通知 globalGroup。
然后只需將調度邏輯移出視圖的生命周期並進入數據庫返回,這就是 IMO 無論如何處理它的方式。 在 Firestore 返回關閉范圍內完成所有進出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.