gpt4 book ai didi

ios - Swift Firebase - 如何向 viewDidLoad 添加观察者,在 viewDidDisappear 中删除它,然后在 viewWillAppear 中再次读取它?

转载 作者:行者123 更新时间:2023-11-29 05:50:55 24 4
gpt4 key购买 nike

我有一个聊天记录,我最初有我的.observe( .childAdded)听众拨入 viewDidLoad并在 viewDidDisappear 中将其删除但读完这条评论后enter image description here from this question我将监听器移至 viewWillAppear现在,每当我切换 View 并返回时,监听器都会再次运行,并且我的 tableData 会两次填充相同的信息。

例如。假设我在聊天中只有 1 条来自其他用户的消息说“你好”。如果聊天 vc 位于 tabTwo 中,则 vc 第一次出现时,代码将运行,并且 collectionView 的数据源将有 1 条表示“hello”的消息。如果我按不同的选项卡并返回到 tabTwo,现在将有 2 条消息显示“hello”(完全相同的消息),因为代码再次运行。如果有 100 条消息,这将成为一个严重的问题。这意味着将会有 200 条消息,并且每次我切换标签并返回时它都会不断增加。

当我删除观察者时,我是否还应该清除 tableData 并在 viewDidDisappear 中重新加载 collectionView,以便再次调用 viewWillAppear 时所有数据都不会重复?这就是我解决问题的方法,但这似乎不正确。

是否有更好的方法在 viewDidLoad 中调用观察者,然后在 viewWillAppear 中再次读取它,而不会导致我的 collectionView 重复数据?

let currentUserId = Auth.auth().currentUser?.uid!
let toId = "theOtherUsersId"

var tableData = [Message]()
let ref = Database.database().reference().child("messageIds")

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

ref.child(currentUserId).child(toId).observe( .childAdded, with: { [weak self] (snapshot) in

let messageId = snapshot.key

self?.getMessagesWith(messageId)
})
}

func getMessagesWith(_ messageId: String) {

Database.database().reference().child("messages").child(messageId).observeSingleEvent(of: .value, with: { [weak self] (snapshot) in

guard let dict = snapshot.value as? [String: Any] else { return }

let message = Message(dict: dict)

self?.tableData.append(message)
self?.collectionView.reloadData()
})
}

override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)

tableData.removeAll() // something seems wrong about doing this
collectionView.reloadData()
ref.removeAllObservers()
}

最佳答案

@GaloTorresSevilla 在我原来的答案下的评论是正确的。他建议将观察者移至 viewWillAppear 并仅使用 messageId 过滤掉 tableData 中已存在的任何消息。他 100% 正确,因为当我切换回选项卡时,没有数据重复

let currentUserId = Auth.auth().currentUser?.uid!
let toId = "theOtherUsersId"

var tableData = [Message]()
let ref = Database.database().reference().child("messageIds")

override func viewDidLoad() {
super.viewDidLoad()
// nothing to do here
}

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

ref.child(currentUserId).child(toId).observe( .childAdded, with: { [weak self] (snapshot) in

let messageId = snapshot.key

// in viewWillAppear if the tableData contains the messageId above then return
if self.tableData.contains (where: { $0.messageId ?? “” == messageId }) {
return
}
self?.getMessagesWith(messageId)
})
}

func getMessagesWith(_ messageId: String) {

Database.database().reference().child("messages").child(messageId).observeSingleEvent(of: .value, with: { [weak self] (snapshot) in

guard let dict = snapshot.value as? [String: Any] else { return }

let message = Message(dict: dict)

self?.tableData.append(message)
self?.collectionView.reloadData()
})
}

override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)

ref.child(currentUserId).child(toId).removeAllObservers()
}

关于ios - Swift Firebase - 如何向 viewDidLoad 添加观察者,在 viewDidDisappear 中删除它,然后在 viewWillAppear 中再次读取它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55676592/

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