如何停止执行 firebase 查询 observe(eventType:with:)

How to stop the execution of a firebase query observe(eventType:with:)

我尝试查找此内容,但找不到停止执行 observe 类型的 firebase 查询的方法。每次数据库在引用处更新时,Observe 都会回调并保持 运行。但是我想在视图消失时从 运行 停止此回调,并在视图出现时再次开始 运行 查询。

这就是我想做的。不幸的是,observe 函数 returns 是一个 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()

这将从该路径中删除所有观察者。 (根据您的数据库路径更改代码并删除观察者)

如有问题欢迎评论

乐于助人!

Unfortunately the observe functions returns an int and not any handler that can be used to stop the query's execution.

Swift 中的句柄 FIRDatabaseHandle 又名 DatabaseHandle 定义为:

typedef NSUInteger FIRDatabaseHandle NS_SWIFT_NAME(DatabaseHandle);

因此,您关于这是整数的说法实际上是正确的。但最好将返回的句柄存储到强变量句柄中,这样您就可以 stop/remove 来自 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)
}

记住你需要跟踪你的整个路径(即特定的 child),否则你可能无法移除你的观察者。

您可能忽略或误读了文档。观察者,也称为监听器(可以)return 一个句柄,可用于删除观察者。句柄实际上是一个 Int.

它在 Detach Listener 下的文档中。当视图关闭时,只需使用句柄分离侦听器即可。

实际上还有一个如何在 documentation 中添加句柄的示例 - 代码如下所示

refHandle = postRef.observe(DataEventType.value, with: { (snapshot) in
  let postDict = snapshot.value as? [String : AnyObject] ?? [:]
  // ...
})

然后您可以使用 removeObserverWithHandle 删除 refHandle

postRef.removeObserver(withHandle: refHandle)

哦,我注意到你问题中的这段代码

Database.database().reference().observe(.value)

这可能不是一个好主意,因为它会向整个数据库中的所有内容添加一个观察者,并且 任何 对任何子节点的更改都会触发该事件并重新加载所有内容!您最好针对特定节点进行更改

let postsRef = Database.database().reference().child("posts")
self.postHandle = postRef.observe(....

这只会 return 在 postsRef

中发生变化