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

时间:2017-09-15 06:47:49

标签: ios swift firebase swift3

我有像这样的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?)

现在我如何从前一个观察者那里获取所有这些值,以便我可以将它们传递给这个函数。

3 个答案:

答案 0 :(得分:0)

为了在火基地添加观察者,首先要对FIR子进行数据库参考。

例如。     让dbRef:FIRDatabaseReference =     FIRDatabase.database()参考()子(" CHILD_NAME&#34)。

添加观察者,

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")
               }
       })
 })

答案 1 :(得分:0)

首先,我认为重要的是说你不需要,也不应该删除此观察者,原因是这个观察者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()方法。

对于手柄,你也可以使用手柄(你也需要对它进行引用),但我会说这更像是个人偏好的问题,但当然它也会起作用:)

答案 2 :(得分:0)

问题的解决不是通过使用addObserver方法,而是通过这样做。

  • 为快照
  • 创建了var的快照类级别
  

var dataSnapshot:((DataSnapshot) - &gt; Void)?

  • 保存快照
  

dataSnapshot = {(snapshot:DataSnapshot)in        ....       }

  • 使用数据快照设置观察者
  

firebaseRef.observe(DataEventType.value,with:dataSnapshot)

  • 删除了观察员
  

firebaseRef?.removeObserver(withHandle:refHandle)

  • 当我需要再次添加观察者时,我刚刚启动了另一个具有相同快照的观察者

  • 使用数据快照设置观察者

  

firebaseRef.observe(DataEventType.value,with:dataSnapshot)