[英]Swift: Firebase auth observer not called if observers of child removed
[英]Swift - How to add a removed observer in firebase
我有一个像这样的火力观察者
let refHandle = firebaseRef.observe(of: DataEventType.value) { (snapshot) in
...
}
它运行良好,并且在某个时候我要删除此观察者,因为我希望它停止观察直到更新值。 我正在通过使用refHandle
firebaseRef?.removeObserver(withHandle: refHandle)
现在,在更新值之后,如何再次添加相同的观察者? Firebase没有提供任何使用refHandle添加观察者的功能。 我唯一的功能就是这个
firebaseRef?.addObserver(NSObject, forKeyPath: String, options: NSKeyValueObservingOptions, context: UnsafeMutableRawPointer?)
现在如何从以前的观察者那里获取所有这些值,以便可以将它们传递给此函数。
为了在火力基地中增加一个观察员,首先要使FIR子级数据库参考。
例如。 让dbRef:FIRDatabaseReference = FIRDatabase.database()。reference()。child(“ child_name”)
添加观察者,例如
dbRef.observe(.value, with: { (snapshot) in
let child = snapshot.children // return number of child
})
对于删除观察者,
为该引用创建处理程序,
var handle: UInt = 0
handler = dbRef.observe(.value, with: {(snapshot) in
snapshot.ref.removeValue(completionBlock: {(error, ref) in
if (error != nil)
{
print("error is \(error)")
return
}
else
{
dbRef.removeObserver(withHandle: handle) // remove specific observer
dbRef.removeAllObservers()// remove all observer
print("child removed successfully")
}
})
})
首先,我认为重要的一点是,您不需要(也不应删除)此观察器 ,原因是该观察器observeSingleEventOf(.value)
就是只读取一次数据,然后立即获取它,正如名字所暗示的那样。删除。 例如,如果您只需要下载一次数据并且不希望数据有太大(或根本没有)变化,那么这可能是理想的选择。
另外,我建议您在类范围的顶部添加一个属性,以保留对您要从中读取的数据库引用的引用:
private let databaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("childNameGoesHere")
每当您需要移除观察者( observe(.value)
, observe(.childAdded)
等)时,它绝对有用。
现在,在您的情况下,对它的引用也将是解决方案,因为似乎您需要稍后再添加此观察器。 再次,正如我所说,您不需要删除观察,因为它只会被触发一次。 因此,您可以使用databaseRef随时随地再次致电:
databaseRef.observeSingleEvent(of: .value) { (snapshot) in
// ...your code goes here
}
就像您一开始所做的一样,它将正常工作:)。
更新:
这是删除观察者,然后在以后重新添加它的方式:
import Firebase
import UIKit
class YourViewController: UIViewController {
// MARK: Private Properties
// You don't need to write the type of rootRef because it's inferred
private let rootRef = Database.database().reference()
// MARK: LifeCycle
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Add your observer
rootRef.observe(of: .value, with: { (snapshot) in
// Do your stuff here and store your data somewhere so you can use it later
})
}
// MARK: User Interaction
func addRootObserver() {
// here you need to make sure that you don't already have an observer at the same reference, otherwise it would duplicate your data.
rootRef.removeAllObservers()
// Add your observer
rootRef.observe(of: .value, with: { (snapshot) in
// Do some more stuff here
})
}
func removeRootObserver() {
// Remove your observer
rootRef.removeAllObservers()
}
}
现在,您可以在需要时安全地调用addRootObserver()
和removeRootObserver()
方法。
对于句柄,您也可以使用句柄(您也需要持有对它的引用),但是我想说这更多是个人喜好问题,但当然也可以使用:)
不通过使用addObserver方法解决问题,而是通过解决此问题。
var dataSnapshot:(((DataSnapshot)-> Void)?
dataSnapshot = {(快照:DataSnapshot)在...中。
firebaseRef.observe(DataEventType.value,with:dataSnapshot)
firebaseRef?.removeObserver(withHandle:refHandle)
当我需要再次添加观察者时,我只是用相同的快照启动了另一个观察者
使用数据快照设置观察者
firebaseRef.observe(DataEventType.value,with:dataSnapshot)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.