我在單個用戶 tapGesture 中運行多個 Firestore 查詢,這要求我確保應用程式中同時運行的 Firestore 查詢最少到沒有。我已經閱讀
使用@Kiril S. 的回答,代碼已更正,如下所示。
class WorkoutViewController: UIViewController {
let dispatchGroup = DispatchGroup()
alert.addAction(UIAlertAction(title: "Select", style: .default, handler: { [self]_ in
dispatchGroup.enter()
DispatchQueue.main.async {
print("Firestore Sequence 2 Initiated")
startActivityIndicator()
if let user = Auth.auth().currentUser {
let userID = user.uid
db.collection("user").whereField("author_uid", isEqualTo: userID).getDocuments { snapshot, error in
if error == nil && snapshot != nil {
for document in snapshot!.documents {
let docID = document.documentID
db.collection("user")
.document(docID)
.setData(["selectedWorkoutID" : workoutRow.workoutId], merge: true)
print("Firestore Sequence 2 Success - user selectedWorkoutID updated")
}
}
if let user = Auth.auth().currentUser {
let userID = user.uid
checkAndCreateUserWorkoutProfile(selectedWorkout: workoutRow, userID: userID)
dispatchGroup.leave()
}
}
}
}
dispatchGroup.notify(queue: .main) {
print("Firestore Sequence 4 Initiated")
print("Firestore Sequence 5 Initiated - Create/Read User Specific Dayprogram data")
}
}))
func checkAndCreateUserWorkoutProfile(selectedWorkout: Workout, userID: String) {
print("Firestore Sequence 3 Initiated - createORread user specific workout profile")
dispatchGroup.enter()
db.collection("Workout")
.whereField("workoutId", isEqualTo: selectedWorkout.workoutId)
.whereField("userID", isEqualTo: userID)
.getDocuments() { (querySnapshot, err) in
if querySnapshot?.count == 0 {
var ref: DocumentReference? = nil
ref = self.db.collection("Workout").addDocument(data:
[
"author_uid": selectedWorkout.author_uid!,
"workoutId": selectedWorkout.workoutId,
"userID": userID
])
{ err in
if let err = err {
print("Error adding user specific workout profile: \(err)")
self.dispatchGroup.leave()
} else {
print("Firestore Sequence 3 Success - User specific workout profile added/created with ID: \(ref!.documentID)")
self.dispatchGroup.leave()
}
}
}
}
}
Xcode 控制臺顯示更正的代碼/查詢序列。

uj5u.com熱心網友回復:
所以基本上現在會發生什么:
- 警報動作開始
- 創造
let dispatchGroup = DispatchGroup() - 進入那個組
- 離開小組==>
dispatchGroup.notify開火 checkAndCreateUserWorkoutProfile啟動,創建自己的調度組等等(已經錯了,沒關系)
所以你有兩個問題:
您必須有 1 個調度組,而不是每個功能都有一個單獨的組。所以轉到
let dispatchGroup = DispatchGroup()類成員級別,這樣兩個函式都在同一個調度組中。并且您
checkAndCreateUserWorkoutProfile需要在前一個呼叫離開之前進入調度組 。所以順序應該改為if let user = Auth.auth().currentUser { let userID = user.uid checkAndCreateUserWorkoutProfile(selectedWorkout: workoutRow, userID: userID) } dispatchGroup.leave()
那樣:
- 警報動作開始
- 進入定義為班級成員的組
- Calls
checkAndCreateUserWorkoutProfile,它進入同一個調度組并開始它的異步呼叫 - 警報動作離開組(但通知不會觸發,因為還
checkAndCreateUserWorkoutProfile沒有離開組) checkAndCreateUserWorkoutProfile最終離開小組 ==>dispatchGroup.notify開火
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386664.html
標籤:迅速 谷歌云firestore 工具包 完成处理程序 调度组
上一篇:AlamoFiredownloadProgress完成處理程式到async/await
下一篇:未呼叫WKWebView導航委托
