проверьте, существует ли имя пользователя в firestore, и верните true SwiftUI

#google-cloud-firestore #swiftui

#google-облако-firestore #swiftui

Вопрос:

Я хочу написать функцию, в которой вводится имя пользователя, которое вводит пользователь, и оно сравнивается с именем пользователя в firestore, если оно существует, функция должна возвращать false, а если нет, должна возвращать true

Вот мой код.. Он всегда возвращает true, когда я его вызываю!

 func checkUser(username: String)-> Bool{
    
    var test = true
    
    FirebaseReference(.user).getDocuments { (snap, err) in
        
        if err != nil{
            
            print((err?.localizedDescription)!)
            return
        }
        
        for i in snap!.documents{
            if   username == i.get("username") as! String {
                test = false
                print("name already taken")
            }
        }
        
    }
    return test
}
  

Ответ №1:

Вы можете использовать логическую переменную, чтобы проверить, нашли ли вы подходящее имя, и вы можете установить для него значение true, если найдете совпадение.

Вы можете использовать следующий код:

 func checkUsername(username: String, completion: @escaping (Bool) -> Void) {
    
    // Get your Firebase collection
    let collectionRef = db.collection("users")

    // Get all the documents where the field username is equal to the String you pass, loop over all the documents.

    collectionRef.whereField("username", isEqualTo: username).getDocuments { (snapshot, err) in
        if let err = err {
            print("Error getting document: (err)")
        } else if (snapshot?.isEmpty)! {
            completion(false)
        } else {
            for document in (snapshot?.documents)! {
                if document.data()["username"] != nil {
                    completion(true)
                }
            }
        }
    }
}
  

Ответ №2:

Используйте Async Await

 func checkUser(userId: String) async throws -> Bool {
    let querySnapshot = try await db.collection(path)
        .whereField("userId", isEqualTo: userId).getDocuments()
    if querySnapshot.isEmpty {
        return false
    } else {
        for document in (querySnapshot.documents) {
            if document.data()["userId"] != nil {
                return true
            }
        }
    }
  

Инициализируйте с помощью Task

 Task.init {
                if try await self.userRepository.checkUser(userId: user.uid) == false {
                    self.userRepository.addUser(FBUser(id: user.uid,
                                                       name: "Anonymous user",
                                                       email: "No email on file",
                                                       createdTime: Timestamp(),
                                                       userId: user.uid))
                }
            }