ios - Firebase removeAllObservers() 在切换 View 时不断调用 -Swift2 iOS

标签 ios swift firebase firebase-realtime-database observers

我阅读了有关此问题的其他堆栈溢出问答,但这似乎是一个 tabBarController 问题,我没有找到任何内容。

我有一个带有 3 个选项卡的 tabBarController。 tab1 是我成功将信息发送到 Firebase 的地方。在 tab2 中,我有 tableView 成功从 tab1 读取数据。

在 tab2 中,我的监听器位于 viewWillAppear 中。我删除了 viewDidDisappear 中的监听器(我也尝试过 viewWillDisappear),这里的某个地方就是问题发生的地方。

override func viewDidDisappear(animated: Bool) {
    self.sneakersRef!.removeAllObservers()
    //When I tried using a handle in viewWillAppear and then using the handle to remove the observer it didn't work here either
    //sneakersRef!.removeObserverWithHandle(self.handle)
   }

一旦我从 tab2 切换到任何其他选项卡,第二次我返回 tab2 时,表数据就会加倍,然后如果我再次切换选项卡并返回,它会增加三倍等等。我尝试在 viewDidLoad 中设置监听器,这会阻止表数据当我切换选项卡时,不会出现重复,但当我从 tab1 发送新信息时,选项卡 2 中的信息永远不会更新。

根据 Firebase 文档和我在 stackoverflow/google 上读到的几乎所有其他内容,监听器应在 viewWillAppear 中设置,并在 viewDidDisappear 中删除。

关于如何防止我在选项卡之间来回切换时重复数据的任何想法?

选项卡1

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class TabOneController: UIViewController{

var ref:FIRDatabaseReference!
@IBOutlet weak var sneakerNameTextField: UITextField!

override func viewDidLoad() {
      super.viewDidLoad()
      self.ref = FIRDatabase.database().reference()
}

@IBAction func sendButton(sender: UIButton) {

      let dict = ["sneakerName":self.sneakerNameTextField.text!]

      let usersRef = self.ref.child("users")
      let sneakersRef = usersRef.child("sneakers").childByAutoID()

      sneakersRef?.updateChildValues(dict, withCompletionBlock: {(error, user) in
                if error != nil{
                    print("\n\(error?.localizedDescription)")
                }
            })
      }
}

选项卡2

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class TabTwoController: UITableViewController{

@IBOutlet weak var tableView: UITableView!

var handle: Uint!//If you read the comments I tried using this but nahhh didn't help
var ref: FIRDatabaseReference!
var sneakersRef: FIRDatabaseReference?
var sneakerArray = [String]()

override func viewDidLoad() {
      super.viewDidLoad()
      self.ref = FIRDatabase.database().reference()
    }

override func viewWillAppear(animated: Bool) {
      super.viewWillAppear(animated)

      let usersRef = self.ref.child("users")
      //Listener
      self.sneakersRef = usersRef.child("sneakers")

      //I tried using the handle
      //---self.handle = self.sneakersRef!.observeEventType(.ChildAdded...

      self.sneakersRef!.observeEventType(.ChildAdded, withBlock: {(snapshot) in

      if let dict = snapshot.value as? [String:AnyObject]{

        let sneakerName = dict["sneakerName"] as? String
        self.sneakerArray.append(sneakerName)

        dispatch_async(dispatch_get_main_queue(), {
                self.tableView.reloadData()
       })

     }

   }), withCancelBlock: nil)
 }

//I also tried viewWillDisappear
override func viewDidDisappear(animated: Bool) {

        self.sneakersRef!.removeAllObservers()

        //When I tried using the handle to remove the observer it didn't work either
        //---sneakersRef!.removeObserverWithHandle(self.handle)
   }


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return self.sneakerArray.count
  }

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      let cell = self.tableView.dequeueReusableCellWithIdentifier("sneakerCell", forIndexPath: indexPath)
      cell.textLabel?.text = sneakerArray[indexPath.row]
      return cell
  }
}

tab3 不执行任何操作。我只是将其用作备用选项卡来来回切换

最佳答案

removeAllObservers 方法工作正常。您当前遇到的问题是由一个小细节缺失引起的:您从未清除 sneakerArray 的内容。


注意:事件回调中不需要 dispatch_async。 Firebase SDK 在主队列上调用此函数。

关于ios - Firebase removeAllObservers() 在切换 View 时不断调用 -Swift2 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39718232/

相关文章:

ios - 当应用程序处于后台或运行状态时而不是应用程序终止时处理推送通知

ios - 如何将选定的uitableviewcell核心数据对象传递给新的 View Controller ?

swift - swift 中的 iterator.element 是什么?

c# - 将 Firestore 与 Azure Functions V2 结合使用 (C#)

ios - 获取文档的 CGPDFDocumentRef 名称

ios - 如何从ios swift上传图像到node/mongodb后端

ios - UIButton 选择器不工作

objective-c - Swift 与 Objective-C 协议(protocol)

firebase - 如何在 Firebase 应用中配置 %APP_NAME%?

javascript - 异步回调返回null