2016-12-27 100 views
1

我使用Firebase作爲消息傳遞目的的數據庫。Firebase加載快照問題

  1. 我的第一個問題在observeEventType: -block。它被頻繁地調用多次,我不知道何時停止活動指標。
  2. 另一個問題是scrollToRowAtIndexPath掛我的視圖,直到所有的Firebase快照不加載。目的是向下滾動到表格視圖的最後一行。請幫忙。

Firebase數據庫查詢中是否有任何內容可以知道Firebase數據庫上有多少計數?

firRef = [[[FIRDatabase database] reference] child:childLocation]; 

    [firRef keepSynced:YES]; 

    fireDBHandler = [firRef observeEventType:FIRDataEventTypeChildAdded 
    withBlock:^(FIRDataSnapshot *snapshot) { 

    NSMutableDictionary<NSString *, NSString *> *messageDic = snapshot.value; 

    [self.clientTable scrollToRowAtIndexPath:[NSIndexPath 
    indexPathForRow:[messages count]-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

    }]; 

回答

2

我建議您閱讀working with lists of data,因爲它解釋了事件是如何工作的。

挖掘到您的代碼在這裏稍微有一些意見:

您使用的是ChildAdded事件和文檔狀態

此事件爲每個現有的孩子每次觸發一次,然後再次 一個新的孩子被添加到指定的路徑。

所以,如果你有10個子節點,那麼這個塊將在連續被調用10次,每個子對象被調用一次。根據你的代碼,它將試圖爲每個不必要的孩子滾動。

有幾個解決方案。

如果您正在加載一系列用戶,則可以使用Value的單個事件。這將讀取所有節點,然後您可以遍歷節點,填充數據源(通常是數組),然後直接滾動到最後一個索引。

[ref observeSingleEventOfType:FIRDataEventTypeValue withBlock: 
      ^(FIRDataSnapshot * _Nonnull snapshot) { 

    //it is here we iterate over each node in the snapshot 
    //and add the data to an array dataSource. 

    } withCancelBlock:^(NSError * _Nonnull error) { 
    NSLog(@"%@", error.localizedDescription); 
}]; 

另一個選擇是利用事件在ChildAdded事件後被調用的事實。

從概念上講,您將一個childAdded觀察者連同一個Value觀察者一起附加到同一節點。子添加的事件將首先觸發,並將遍歷每個孩子,以便您可以將其添加到數組數據源,然後當完成值事件將觸發,您可以重新加載tableView或滾動到最後一個索引,因爲所有孩子都已經加載。

有關編碼示例,請參閱我對Loading Records的回答。

+0

是的,observeSingleEventOfType保存我的時間。它在一個節點返回計數,並且我動畫直到所有快照都等於計數。謝謝!! – Ketan