Firebase .childAdded和活动指标

当我在API调用之前开始活动指示器并停止之后,我遇到了一个问题,但是如果使用.childAdded填充TableView,则无法正确执行此操作。 由于.childAdded只有在添加子项时才会调用,所以我的活动指标始终在加载。 例如:

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时停止。 可以请一些build议如何正确地做到这一点? 非常感激。

根据build议的答案进行一些更新

我将举一个基于聊天应用的例子,这会更容易理解。 我有以下的数据库结构:

 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,当客户端按下所选的聊天时,第二个视图控制器从“消息”对象中填充所有的孩子。 所以基本上第二个视图控制器不需要调用函数.observeSingleEvent(:.value来获取unique_user_chat_id,只有Childs .childAdded在'messages'对象中。

当你观察childAdded ,如你所说,这可能永远不会被调用。

childAdded更改为valueChanged并观察childAdded 。 将该animation调用添加到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() } }) }