检查用户是否存在 firebase 3.0 + swift
Check if user exist with firebase 3.0 + swift
我有一个应用程序,在用户使用 Firebase 身份验证后,它将数据存储在 Firebase 数据库中。在存储数据之前,我想检查用户提供的用户名是否已经存在于数据库中。所以如果它不存在我可以给用户这个唯一的用户名(就像每个用户都有一个唯一的用户名)。所以我有一个 textField
用户输入他的用户名,然后按下一步。然后应用程序应该检查用户名是否存在,并告诉用户是否需要更改。
所以我用来检查用户名是否存在的代码:
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if snapshot.hasChild(self.usernameTextField.text!){
print("user exist")
}else{
print("user doesn't exist")
}
})
所以每次按下下一个按钮时,都会调用这段代码。这样做的问题是结果始终与第一次搜索相同(即使在 textField 值更改之后)。
例如,如果我搜索 Jose,而 Jose 存在于我的数据库中,那么将打印 "user exist"。但是当我将 textField
更改为不存在的名称时,它仍然显示 "user exist".
我发现我需要将 .Value
更改为 FIRDataEventType.Value
if (usernameTextField.text?.isEmpty == false){
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Users").observeSingleEventOfType(FIRDataEventType.Value, withBlock: { (snapshot) in
if snapshot.hasChild(self.usernameTextField.text!){
print("true rooms exist")
}else{
print("false room doesn't exist")
}
})
struct ModelUser {
var id: String
var name: String
init(data: DataSnapshot) {
// do init stuff
}
}
func isUserRegistered(with id: String, completion: @escaping (_ exists: Bool, _ user: ModelUser?) -> ()) {
DatabaseReference.users.child(id).observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists() {
// user is already in our database
completion(true, ModelUser(data: snapshot))
} else {
// not in database
completion(false, nil)
}
}
}
在与您类似的情况下,这对我有用。您也可以像这样使用 Rx。
enum CustomError: Error {
case userNotRegistered
var localizedDescription: String {
switch self {
case .userNotRegistered:
return "Dude is not registered..."
}
}
}
func isUserRegistered(with id: String) -> Observable<(ModelUser)> {
let reference = DatabaseReference.users.child(id)
return Observable<ModelUser>.create({ observer -> Disposable in
let listener = reference.observe(.value, with: { snapshot in
if snapshot.exists() {
observer.onNext(ModelUser(data: snapshot))
observer.onCompleted()
} else {
observer.onError(CustomError.userNotRegistered)
}
})
return Disposables.create {
reference.removeObserver(withHandle: listener)
}
})
}
这两种情况的关键都是使用快照的.exists()方法。
我有一个应用程序,在用户使用 Firebase 身份验证后,它将数据存储在 Firebase 数据库中。在存储数据之前,我想检查用户提供的用户名是否已经存在于数据库中。所以如果它不存在我可以给用户这个唯一的用户名(就像每个用户都有一个唯一的用户名)。所以我有一个 textField
用户输入他的用户名,然后按下一步。然后应用程序应该检查用户名是否存在,并告诉用户是否需要更改。
所以我用来检查用户名是否存在的代码:
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if snapshot.hasChild(self.usernameTextField.text!){
print("user exist")
}else{
print("user doesn't exist")
}
})
所以每次按下下一个按钮时,都会调用这段代码。这样做的问题是结果始终与第一次搜索相同(即使在 textField 值更改之后)。
例如,如果我搜索 Jose,而 Jose 存在于我的数据库中,那么将打印 "user exist"。但是当我将 textField
更改为不存在的名称时,它仍然显示 "user exist".
我发现我需要将 .Value
更改为 FIRDataEventType.Value
if (usernameTextField.text?.isEmpty == false){
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Users").observeSingleEventOfType(FIRDataEventType.Value, withBlock: { (snapshot) in
if snapshot.hasChild(self.usernameTextField.text!){
print("true rooms exist")
}else{
print("false room doesn't exist")
}
})
struct ModelUser {
var id: String
var name: String
init(data: DataSnapshot) {
// do init stuff
}
}
func isUserRegistered(with id: String, completion: @escaping (_ exists: Bool, _ user: ModelUser?) -> ()) {
DatabaseReference.users.child(id).observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists() {
// user is already in our database
completion(true, ModelUser(data: snapshot))
} else {
// not in database
completion(false, nil)
}
}
}
在与您类似的情况下,这对我有用。您也可以像这样使用 Rx。
enum CustomError: Error {
case userNotRegistered
var localizedDescription: String {
switch self {
case .userNotRegistered:
return "Dude is not registered..."
}
}
}
func isUserRegistered(with id: String) -> Observable<(ModelUser)> {
let reference = DatabaseReference.users.child(id)
return Observable<ModelUser>.create({ observer -> Disposable in
let listener = reference.observe(.value, with: { snapshot in
if snapshot.exists() {
observer.onNext(ModelUser(data: snapshot))
observer.onCompleted()
} else {
observer.onError(CustomError.userNotRegistered)
}
})
return Disposables.create {
reference.removeObserver(withHandle: listener)
}
})
}
这两种情况的关键都是使用快照的.exists()方法。