簡體   English   中英

如何在 firebase firestore 回調中輸入 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM