簡體   English   中英

Firebase 數據庫異步方法的返回值

[英]Return value from Firebase Database async method

我想檢查 Firebase 中是否已經有一個具有所選用戶名的用戶,並且我創建了一個函數checkUsernameAlreadyTaken(username: String) -> Bool來執行此操作。 這是函數的代碼:

func checkUsernameAlreadyTaken(username: String) -> Bool {
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in
        print(username)
        if snapshot.exists() {
            print("Snapshot exist")
            self.alreadyTaken = true
        }
    })
    if alreadyTaken == true {
        print("Username already taken")
        return false
    }
    else {
        return true
    }

}

問題是方法observe(_ eventType: FIRDataEventType, with block: (FIRDataSnapshot) -> Void) -> Uint是一個異步方法,所以我不能使用你在上面看到的策略。 但我無法從 Firebase 方法返回值,因為它是一個 void 方法......
我怎么解決這個問題?

還有一件事。 如果連接錯誤或與服務器沒有連接,我如何也返回 false?

您必須自己使用異步完成處理程序並驗證是否有 Internet 連接:

func checkUsernameAlreadyTaken(username: String, completionHandler: (Bool) -> ()) {
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in
        print(username)
        if snapshot.exists() {
            completionHandler(false)
        } else {
            let connectedRef = FIRDatabase.database().reference(withPath: ".info/connected")
            connectedRef.observe(.value, with: { snapshot in
                if let connected = snapshot.value as? Bool, connected {
                    completionHandler(true)
                } else {
                    completionHandler(false)
                    // Show a popup with the description
                    let alert = UIAlertController(title: NSLocalizedString("No connection", comment: "Title Internet connection error"), message: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), preferredStyle: .alert)
                    let defaultOkAction = UIAlertAction(title: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), style: .default, handler: nil)
                    alert.addAction(defaultOkAction)

                    self.present(alert, animated: true, completion: nil)
                }
            })
        }
    })
}

然后你調用你的方法:

checkIfUserExists(username: text, completionHandler: { (value) in
    // ...
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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