繁体   English   中英

Swift-如何在Firebase中添加已删除的观察者

[英]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的快照类级别

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM