提问人:Parth 提问时间:2/23/2021 更新时间:2/23/2021 访问量:406
如何停止 firebase 查询的执行 observe(eventType:with:)
How to stop the execution of a firebase query observe(eventType:with:)
问:
我尝试查找此内容,但找不到停止执行 firebase 查询类型的方法。Observe 接受回调,并在每次在引用处更新数据库时继续运行它。但是我想在视图消失时停止运行此回调,并在视图出现时再次开始运行查询。observe
所以这就是我想做的。不幸的是,observe 函数返回的是 int,而不是任何可用于停止查询执行的处理程序。
func viewWillDissappear(animated: Bool) {
...
stopQuery()
}
func viewWillAppear(animated: Bool) {
...
startQuery()
}
func startQuery() {
Database.database().reference().observe(.value) { (snapshot) in
//Rest of callback to be executed only when view will appear and is visible
}
}
func stopQuery() {
//Stop query callback execution started by startQuery
}
注意:我不希望答案依赖于使用 vairble 来检查视图是否可见并跳过回调执行。我想强制取消当前正在运行的查询,并在下次出现视图时重新启动它。
答:
您可以删除所有观察者:
Database.database().reference().child("ChildName").child("any sub child if any").removeAllObservers()
这将从此路径中删除所有观察者。(根据您的数据库路径更改代码并删除观察者)
如果您有任何问题,请发表评论。
很乐意为您提供帮助!
评论
不幸的是,observe 函数返回的是 int 而不是任何处理程序 可用于停止查询的执行。
Swift 中的句柄 aka 定义为:FIRDatabaseHandle
DatabaseHandle
typedef NSUInteger FIRDatabaseHandle NS_SWIFT_NAME(DatabaseHandle);
因此,您实际上认为这是一个整数是正确的。但最好将返回的句柄存储到强变量句柄中,以便可以从函数中停止/删除观察器。stopQuery()
这样:
// MARK: - Properties
private var handle: DatabaseHandle?
// MARK: - Functions
...
...
func startQuery() {
handle = Database.database().reference().observe(.value) { (snapshot) in
//Rest of callback to be executed only when view will appear and is visible
}
}
func stopQuery() {
//Stop query callback execution started by startQuery.
Database.database().reference()
.removeObserver(withHandle: handle)
}
请记住,您需要跟踪整个路径(即特定的子路径),否则可能无法删除观察者。
您可能忽略或误读了文档。观察者,也称为侦听器(可以)返回一个句柄,可用于删除观察者。句柄实际上是一个 Int。
它位于 Detach Listener 下的文档中。当视图关闭时,只需使用句柄分离侦听器即可。
实际上,文档中还有一个如何添加句柄的示例 - 代码如下所示
refHandle = postRef.observe(DataEventType.value, with: { (snapshot) in
let postDict = snapshot.value as? [String : AnyObject] ?? [:]
// ...
})
然后,您可以使用它来删除 refHandleremoveObserverWithHandle
postRef.removeObserver(withHandle: refHandle)
哦,我在你的问题中注意到了这段代码
Database.database().reference().observe(.value)
这可能不是一个好主意,因为它会向整个数据库中的所有内容添加一个观察者,并且对任何子节点的任何更改都将触发该事件并重新加载所有内容!最好将更改的目标定位于特定节点
let postsRef = Database.database().reference().child("posts")
self.postHandle = postRef.observe(....
这只会返回帖子中的更改Ref
评论