我是新来的,请原谅我,如果我没有设法创造一个好的 格式正确的问题。
我的问题是我无法在Firebase
中获取特定孩子的快照。
我需要放一个事件监听器,当数据库发生变化时,它会返回值(用户的标记):
notifications.child("tokens").child("id_user_token").child(user)
。
我还发布了数据库树的图像,以便您可以看到其中的内容。
我的目的是保存从数据库中检索到的令牌,并创建一个HashMap
(用于构建通知),其中包含令牌,标题和消息。从代码中可以看出,我使用init()
函数传递了所有参数。我尝试在ViewController.swift
中调用此函数,如下所示:
"FirebaseMessagingService.init(user: "2", title: "Test",message: "Test")"
正如您从数据库图像中看到的那样,用户有id = 2
,但当我尝试打印快照时,它会打印null
,我无法理解代码的错误。{{ 3}}
Image of the Database tree
import Foundation
import FirebaseMessaging
import FirebaseDatabase
class FirebaseMessagingService{
var mDatabase : DatabaseReference
var notifications = DatabaseReference()
init(user: String,title: String, message:String){
self.mDatabase = Database.database().reference()
self.notifications = Database.database().reference()
notifications = mDatabase.child("notificationRequests")
var notification = NSMapTable<AnyObject, AnyObject>()
notifications.child("tokens").child("id_user_token").child(user).observeSingleEven t(of: .value, with: { snapshot in
var token = Messaging.messaging().fcmToken! as String
print("\n\n\n\n\(snapshot)")
token = (snapshot.value as? String)!
notification.setValue(token, forKey: "toUser")
notification.setValue(title, forKey: "title")
notification.setValue(message, forKey: "message")
}){ (error) in
print("\n\n\n\n")
print(error.localizedDescription)
}
答案 0 :(得分:1)
尝试更改代码,如下所示
import FirebaseDatabase
class FirebaseMessagingService{
var ref: DatabaseReference!
init(user: String, title: String, message: String) {
self.ref = Database.database().reference()
let notifRef = self.ref.child("notificationRequests")
let thisUserRef = notifRef.child("tokens").child("id_user_token").child(user)
print(thisUserRef)
thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot)
})
}
}
至少应该打印这个应该是
的UserRefyourDataBase/notificationRequests/tokens/id_user_token/2
它还应该打印快照
snap( 2: cq3Xy...... )
让我们知道什么打印以及打印时路径是否正确。
此外,在您的问题中,您说明了您的目标
我需要放一个事件监听器,它会返回值( 当数据库发生变化时,用户的标记:
您提供的代码不会这样做。您正在使用
.observeSingleEvent
仅此而已 - 一次观察单个事件。它不会在节点上留下监听器以用于将来的事件。
如果您想观察所有事件,请使用
.observe(.value... (or .childAdded etc)
但是,我不认为你的意思是你想要观察特定节点的变化(或者你做过)。您可能意味着当其他地方的数据库发生更改时,您将需要获取该用户的uid,而您的问题中的代码正在尝试这样做。
最后一件事:
你真的不应该把它定义为一个班级。它应该是一个在viewController
中被调用的函数class ViewController: UIViewController {
var ref: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference()
self.showUid(user: "2", title: "some title", message: "some message")
}
func showUid( user: String, title: String, message: String) {
let notifRef = self.ref.child("notificationRequests")
let thisUserRef = notifRef.child("tokens").child("id_user_token").child(user)
print(thisUserRef)
thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot)
})
}
}