[英]How to check if value exists in other collection in Firebase/Firestore
[英]How to check if a user already exists in a Firestore collection after signing in with Firebase Auth in SwiftUI
@Published var isNewUser: Bool?
init() {
self.isNewUser = false
}
func checkIfTheUserExistsInDataBase(
userID: String?, completion: @escaping (_ isNewuser: Bool) -> Void
) {
let docRef = db.collection("users").whereField("user_id", isEqualTo: userID!).limit(to: 1)
docRef.getDocuments { querySnapshot, error in
if error != nil {
print(error?.localizedDescription)
} else {
if let doc = querySnapshot?.documents, doc.isEmpty {
completion(true)
} else {
completion(false)
}
}
}
}
func login(
email: String, password: String,
completion: @escaping (_ error: Error?, _ isEmailVerified: Bool) -> Void
) {
Auth.auth().signIn(withEmail: email, password: password) { authDataResult, error in
if error == nil {
if authDataResult!.user.isEmailVerified {
DispatchQueue.main.async {
self.checkIfTheUserExistsInDataBase(userID: authDataResult?.user.uid) { isNewUser in
self.isNewUser = isNewUser
}
}
UserDefaults.standard.set(authDataResult?.user.uid, forKey: CurrentUserDefaults.userID)
completion(error, true)
} else {
print("Email not verified")
completion(error, false)
}
} else {
completion(error, false)
}
}
}
我嘗試使用DispatchSemaphore
讓運行時間更長的 function 首先執行,即checkIfTheUserExistsInDataBase
,但它凍結了我的應用程序。 有一個更好的方法嗎?
Firebase 支持 async/await(參見這個短片、這個視頻和我創建的這篇博文來詳細解釋這一點。
要回答您的問題:您應該使用 async/await 來調用用戶登錄,等待結果,檢查用戶是否存在於您的 Firestore 集合中,以及更新 UI。
以下代碼片段(基於此示例應用程序)使用 Firestore 中新的COUNT
功能來計算users
集合中的文檔數量,以確定是否至少有一個用戶的 ID 為剛剛登錄的用戶.
func isNewUser(_ user: User) async -> Bool {
let userId = user.uid
let db = Firestore.firestore()
let collection = db.collection("users")
let query = collection.whereField("userId", isEqualTo: userId)
let countQuery = query.count
do {
let snapshot = try await countQuery.getAggregation(source: .server)
return snapshot.count.intValue >= 0
}
catch {
print(error)
return false
}
}
func signInWithEmailPassword() async -> Bool {
authenticationState = .authenticating
do {
let authResult = try await Auth.auth().signIn(withEmail: self.email, password: self.password)
if await isNewUser(authResult.user) {
}
return true
}
catch {
print(error)
errorMessage = error.localizedDescription
authenticationState = .unauthenticated
return false
}
}
有關如何在 SwiftUI 應用程序中實施 Firebase 身份驗證的更多詳細信息,請觀看此視頻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.