swift - swift firebase创建没有childByAutoId的孩子
问题描述
我有一个在线 iOS 应用程序,我需要知道用户的姓名和号码以及在线用户的姓名和号码,所以我让 User 结构有一个 childByAutoID 以在创建时添加子名称和号码。但问题是我正在尝试计算在线用户并将其显示在我的 ViewController 上,所以我的想法是让 Online User json 结构在登录时添加并在注销时删除,所以我将姓名 + 电话设为Online Users 结构中名称和编号的父级,但我每次尝试从注销 Viewcontroller 访问它时,var name + number 都返回为空,因此我无法在没有子 ID 的情况下将其从 firebase 数据库中删除
我不想将 childByAutoId 用于在线用户,因为我不知道如何存储密钥,因为我使用的是异步函数,这使得如何检索它也太复杂了
//1st view controller
func getID() -> String {
return String(nameField.text! + numberField.text!)
}
@IBAction func linkTapped(_ sender: Any) {
if (nameField.text != nil && numberField.text != nil) {
let alert = UIAlertController(title: "Phone Number", message: "Is this your phone number? \n \(numberField.text!)", preferredStyle: .alert)
let action = UIAlertAction(title: "Yes", style: .default) { (UIAlertAction) in
PhoneAuthProvider.provider().verifyPhoneNumber("+1 " + self.numberField.text!, uiDelegate: nil) {
(verificationID, error) in
if error != nil {
print("error: \(String(describing: error?.localizedDescription))")
print(self.numberField.text ?? "no number entered")
} else {
getID()
let defaults = UserDefaults.standard
defaults.set(verificationID, forKey: "authVID")
defaults.synchronize()
self.performSegue(withIdentifier: "code", sender: Any?.self)
let ref = Database.database().reference().child("Users").childByAutoId()
let values = ["Name": self.nameField.text, "Phone": self.numberField.text]
ref.updateChildValues(values as [AnyHashable : Any], withCompletionBlock: { (err, ref) in
if err != nil {
print(err as Any)
return
}
print("user saved into firebase db")
})
let ref2 = Database.database().reference().child("Online Users")
let onlineRef = ref2.child(self.getID())
onlineRef.updateChildValues(values as [AnyHashable : Any])
}
}
}
let cancel = UIAlertAction(title: "No", style: .cancel, handler: nil)
alert.addAction(action)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
} else {
let alert = UIAlertController(title: "You left me empty", message: "please fill your name and number", preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
}
}
// 第二个视图控制器
@IBAction func signOutFunction(_ sender: Any) {
do {
try Auth.auth().signOut()
let newVar = ViewController()
let ref = Database.database().reference().child("Online Users")
ref.child(newVar.getID()).removeValue()
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
} catch let error {
print("not signed in...", error)
}
}
解决方案
推荐阅读
- python - hdf5 和 tensorflow 以及 python 3.7 的错误
- python - 我可以使用 Python 运行一段 VBA 代码而不将我的宏保存在 Excel 中吗?
- mapbox - Mapbox Matrix API - 避开高速公路
- python-3.x - Python socket.getaddrinfo() 的 Windows DNS 问题
- excel - 按特定数字递增范围内的值
- android - 在flutter中从firestore获取这些数据后,我想对数据进行洗牌
- asp.net - 如何使用 MVC 5 在控制器外部访问 HttpContext?
- azure-devops - 条件内带有 bash 表达式的 Azure Pipeline
- c# - 我想调用一个位于多个 GameObjects 上的脚本上的函数。但我希望该函数在该实例中仅激活一个对象
- r - 在这种情况下如何正确使用 label_wrap_gen ?