2017-09-02 36 views
0

我面对我时,API调用之前启动活动指示灯和后停止的问题,但是我无法做正确,如果我填写的TableView与.childAdded。由于.childAdded仅在添加子项时才会调用,所以我的活动指示符始终处于加载状态。例如:火力地堡.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被重新加载。 可以请一些建议如何正确地做到这一点?非常感激。

基础上,建议答案有些更新:

我给基于聊天应用为例,它会更容易理解。 我有以下的数据库结构:

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

enter image description here

父视图控制器获取所有unique_user_chat_id并且当客户端然后按所选择的聊天,第二视图控制器从'消息'对象中填充所有孩子。正如你看到childAdded .value的在“消息”对象获取unique_user_chat_id,独生子女.childAdded

回答

0

,正如你说的这个可能永远不会得到所谓:所以基本上第二视图控制器并不需要调用函数.observeSingleEvent(的。 。

变化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() 
     } 
    }) 

} 
+0

是的,我能做到这一点,并从第一次看它会工作,但如果用户将连接到互联网的问题?动画将开始,API将不会被调用,动画将在2秒内停止(以延迟为例)。 – Sargot

+0

@Sargot我修改了我的答案。 –

+0

非常感谢您的帮助!你能否根据你的回答检查我更新的问题,并告知我是否做得正确?另外我不确定我应该拨打哪个动画? – Sargot