当我在API调用之前启动活动指示器并在之后调用之后停止时,我遇到了一个问题,但是如果用.childAdded填充TableView,我将无法正确执行。由于.childAdded仅在添加child时才调用,因此我的活动指示器始终处于加载状态。例如:
func parseData() {
self.activityIndicator.startAnimating()
DataService.instance.SOME_DATA.observe(.childAdded, with: { (snapshot) in
if let snapshot = snapshot.value as? Dictionary<String, Any> {
let data = someData(data: snapshot)
self.array.append(data)
}
DispatchQueue.main.async {
self.tableView.reloadData()
self.activityIndicator.stopAnimating()
}
})
}
因此,基本上,如果没有任何值,则不会调用.childAdded,并且活动指示器永远不会停止,因为它仅在重新加载tableView时才停止。
可以请一些建议如何正确执行吗?非常感激。
根据建议的答案进行了一些更新:
我将给出一个基于聊天应用程序的示例,它会更容易理解。
我具有以下数据库结构:
user_messages
unique_user_id
unique_user_chat_id
unique_message_1
unique_message_2
unique_message_3
unique_message_4
messages
unique_message_1
text...
unique_message_2
text...
unique_message_3
text...
unique_message_4
text...
我有2个视图控制器,每个都有一个TableView
父级视图控制器获取所有unique_user_chat_id,当客户端按下所选聊天时,第二个View Controller从“消息”对象填充所有Childs。所以基本上第二个View Controller不需要调用.observeSingleEvent(of:.value函数来获取unique_user_chat_id,仅将Childs .childAdded添加到“ messages”对象中即可。
最佳答案
正如您观察到的childAdded
所示,您可能永远也不会调用它。
将childAdded
更改为valueChanged
并观察childAdded
。将动画调用添加到valueChanged
。
仅当获取初始数据时,才应在观察childAdded时设置活动指示器。
func fetchData() {
activityIndicator.startAnimating()
DataService.instance.SOME_DATA.observe(.value, with: { (snapshot) in
// Handle current value and stop activity indicator
if let snapshot = snapshot.value as? Dictionary<String, Any> {
let data = someData(data: snapshot)
self.array.append(data)
}
DispatchQueue.main.async {
self.tableView.reloadData()
self.activityIndicator.stopAnimating()
// Observe new childs added
self.observeData()
}
})
}
func observeData() {
DataService.instance.SOME_DATA.observe(.childAdded, with: { (snapshot) in
if let snapshot = snapshot.value as? Dictionary<String, Any> {
let data = someData(data: snapshot)
self.array.append(data)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
})
}
关于ios - Firebase .child已添加和事件指示器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46017039/