swift - 检查用户名是否存在不会产生错误和错误

标签 swift firebase-realtime-database error-handling

我想在用户决定更改用户名之前检查用户名是否已被占用。出于某种原因,当检查并按下完成时,会出现错误横幅,说明用户名已被使用(即使我输入的用户名显然不是),同时我的打印语句“已成功更改用户名”也在控制台中打印。用户名在数据库中成功更改,但由于出现错误横幅,它阻止我关闭推送的 View Controller 。

我似乎无法弄清楚为什么无论如何都会显示错误..这是我编写的代码..


 func textFieldDidEndEditing(_ textField: UITextField) {


        let trimmedString = usernameTextField.text?.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression).lowercased()

        guard trimmedString != "" else {
            print("ERROR: Please enter a valid username")
            usernameChanged = false
            return
        }

        updatedUsername = trimmedString?.lowercased()
        usernameChanged = true


    }

 func updateUsername() {
        guard let updatedUsername = self.updatedUsername else { return }
        guard let currentUid = Auth.auth().currentUser?.uid else { return }
        guard usernameChanged == true else { return }

        let reference = Database.database().reference().child("activeUsernames")
        let query = reference.queryOrdered(byChild: "username").queryEqual(toValue: updatedUsername )


        query.observe(.value, with: { (DataSnapshot) in

            if DataSnapshot.exists() {

                print("Username already exists")
                self.errorBanner()



                } else {
                print("Username successfully changed")
                reference.child(currentUid).child("username").setValue(updatedUsername)

                USER_REF.child(currentUid).child("username").setValue(updatedUsername) { (err, ref) in

                    guard let userProfileController = self.userProfileController else { return }
                    userProfileController.fetchCurrentUserData()
                    self.navigationController?.popViewController(animated: true)


                }


            }

        })


    }


    @objc func handleDone() {


        view.endEditing(true)

        if usernameChanged {
            updateUsername()


        }

    }

最佳答案

您滥用了 FirebaseRealtimeDatabase API。

observe 应该传递实时事件,但您需要检查用户名是否存在,只需读取一次(请在此处检查如何执行 https://firebase.google.com/docs/database/ios/read-and-write#read_data_once)

所以您在代码中看到的基本上是您对设置的值感到困惑 :)

不过也有一些 Swift 的建议:

func textFieldDidEndEditing(_ textField: UITextField) {
// Here non-regex API is better
        let trimmedString = usernameTextField.text?.trimmingCharacters(in: .whitespaceAndNewline)
        guard trimmedString != "" else {
            print("ERROR: Please enter a valid username")
            return
        }
        updatedUsername = trimmedString?.lowercased()
    }

// Swift willSet / didSet is better
var updatedUsername: String? {
    willSet {
       if updatedUsername != newValue {
           usernameChange = true
       }
    }
}
var usernameChanged: Bool

关于swift - 检查用户名是否存在不会产生错误和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426565/

相关文章:

ios - 为什么从未执行过的 Swift 3 代码会抛出运行时错误?

javascript - 如何在 firebase web 中获取新添加的子项?

android - 无法将 POJO 写入 Firebase 数据库

ios - Swift Firebase 排序查询

c++ - 为什么我的函数无法确定字符是否为元音?

swift - 有没有办法使默认的 NSDragOperation 移动并仍然允许复制?

ios - 如何在Apple Watch上继续收集运动传感器数据?

ios - TabBar 覆盖导航堆栈中的 View Controller 内容

go - go中一个发生错误,关闭多个goroutine

django - 在 Python Shell 中创建的对象,查询时无法识别