gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:58:21 27 4
gpt4 key购买 nike

我阅读了其他有关此问题的堆栈溢出问答,但它似乎是一个 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 发送新信息时,信息永远不会在 tab2 中更新。

根据 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com