Firebase 事件侦听器不起作用,我无法接收正确的快照
Posted
技术标签:
【中文标题】Firebase 事件侦听器不起作用,我无法接收正确的快照【英文标题】:Firebase Event listener doesn't work and I can't receive the right snapshot 【发布时间】:2017-05-22 11:50:22 【问题描述】:我是新来的,如果我没有设法创造一个好的,请原谅我 和格式良好的问题。
我的问题是我无法在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
,我无法理解代码有什么问题。Image of the Database tree
Here is the exported JSON
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)
【问题讨论】:
【参考方案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)
)
至少应该打印 thisUserRef 应该是
yourDataBase/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)
)
【讨论】:
感谢您的回答。我更新了代码,但仍然得到“Snap (2)以上是关于Firebase 事件侦听器不起作用,我无法接收正确的快照的主要内容,如果未能解决你的问题,请参考以下文章
cleanup() 在使用 Firebase Firestore onSnapshot 的 useEffect() 中不起作用
按钮 onClick 事件侦听器在 Electron 应用程序中不起作用