繁体   English   中英

Firebase .child已添加和活动指示器

[英]Firebase .childAdded and activity Indicator

当我在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 ,正如您所说,这可能永远不会被调用。

childAddedvalueChanged并观察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()
        }
    })

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM