2017-09-02 35 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