【发布时间】:2016-09-13 01:56:12
【问题描述】:
我有一个作为 UITableView 工作的 SlackTextViewController 的单一视图。我正在使用公共字符串在“状态”之间切换,允许它读取某个状态下的一组数据和另一个状态下的另一组数据。问题是当我来回切换到原始状态时,它会打印数据 2、3、4 次;和我来回一样多。我正在从 Firebase 服务器加载数据,我认为这可能是 Firebase 问题。这是我的代码...
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if chatState == "ALL"
{
self.globalChat()
}else if chatState == "LOCAL"
{
self.localChat()
}
}
override func viewDidDisappear(animated: Bool) {
self.messageModels.removeAll()
tableView.reloadData()
ref.removeAllObservers()
}
func chatACTN()
{
if chatState == "ALL"
{
self.viewWillAppear(true)
}else if chatState == "LOCAL"
{
self.viewWillAppear(true)
}
}
func globalChat()
{
self.messageModels.removeAll()
tableView.reloadData()
let globalRef = ref.child("messages")
globalRef.keepSynced(true)
globalRef.queryLimitedToLast(100).observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
if snapshot.exists()
{
let names = snapshot.value!["name"] as! String
let bodies = snapshot.value!["body"] as! String
let avatars = snapshot.value!["photo"] as! String
let time = snapshot.value!["time"] as! Int
let messageModel = MessageModel(name: names, body: bodies, avatar: avatars, date: time)
self.messageModels.append(messageModel)
self.messageModels.sortInPlace{ $0.date > $1.date }
}
self.tableView.reloadData()
})
}
func localChat()
{
self.messageModels.removeAll()
tableView.reloadData()
print("LOCAL")
}
【问题讨论】:
-
您是否希望 globalChat 中的数据在您切换到 localChat 时也能保持更新?
-
不确定这是否是问题所在,但在获取快照之前尝试使用 self.messageModel = [] 而不是 removeAll,我遇到了类似的问题,并且曾经对我有用。
-
@SamM 是的,我希望它保持更新。如果更容易停止并简单地重新加载,那就可以了。此处为中级 Swift 技能
-
@CharlesJr 你能告诉我你是如何在状态之间切换的吗?
-
@SamM 我有一个初始的公共字符串为“ALL”。单击 UINavButton 后,它会变为“本地”。基本上我只是使用几个 if 语句来读取全局信息(如果它是“ALL”)和本地信息(如果它是“本地”)。如果我需要一个结构/枚举来进行真实状态切换,请告诉我。
标签: swift uitableview firebase-realtime-database state observers