目標:
我的目標是獲取初始資料,在我確定所有資料被獲取后更新 UI,并立即繼續觀察變化。
問題所在
<我認為有兩種方法可以做到這一點:
getData方法并一次性獲取所有資料(笨重)。這很好,因為我知道我已經一次性獲取了所有的資料,我可以相應地更新UI并繼續監聽變化(CRUD)。
這種方法的問題在于,我不能只是在之后附加監聽器,來監聽新的添加(插入),并等待新的專案。它的作業方式不同(這是有道理的,因為我在沒有通過監聽器與資料庫同步的情況下獲取資料),而且在我附加監聽器之后,我得到的回呼觸發次數與當前根節點中的專案數量一樣多。所以我得到的很可能是相同的資料。
因此,這似乎是一種矯枉過正的做法。
- 第二種方法是只附加監聽器,并獲取所有資料。但這樣做的問題是,我不知道所有資料何時被獲取,因為它是按順序來的,一個接一個。因此,我無法相應地更新用戶界面。
下面是一些代碼示例:
我目前正在使用getData方法來獲取所有之前的資料,就像這樣:我正在使用getData方法來獲取所有之前的資料。
func getInitialData(completion: @escaping DataReadCompletionHandler){
rootNodeReference.getData { optionalError, snapshot in.
if let error = optionalError {
完成([])
回傳。
}
if let value = snapshot.value。
let models = self.parseData(type: [MyModel].self, data: value) as? [MyModel] {
completion([MyModel](models.values))
}
}
}
正如我所說,有了這個,我確信我有了所有之前的資料,我可以相應地設定我的 UI。
此后,我只對新的更新(更新、洗掉、插入)感興趣。
而后我通過監聽器進行連接。下面是一個監聽器的例子,當有新的東西被添加到根節點時,該監聽器會進行監聽:
rootNodeReference.observe(DataEventType.childAdded, with: {[weak self] snapshot in
guard let `self` = self else {return }
if let value = snapshot.value。
let model = self.parseData(type: MyModel.self, data: value) as? MyModel{
self.firebaseReadDelegate?.event(type: .childAdded, model: model)
}
})
如果有了這個監聽器,我就可以在某種程度上只在有新東西添加時繼續更新,那就太好了。
不過,我想選項 2 將是一個更好的方法,但如何知道我何時通過監聽器獲得了所有資料?
uj5u.com熱心網友回復:
有兩種方法可以做到這一點,但它們都依賴于 Firebase 對事件觸發順序的相同保證。
當你在同一個路徑/查詢上同時觀察到 因為如果這樣保證,你可以為 添加第二個監聽器并不會增加從資料庫中讀取的資料量,因為Firebase會在場景后面重復讀取它們。
child事件和value事件時,value事件會在所有相應的child事件之后觸發。
.value添加一個額外的監聽器rootNodeReference.observeSingleEvent(of: DataEventType.value, with: { snapshot in.
...初始資料是全部加載。
})
你也可以放棄childAdded監聽器,只使用一個observe(.value,如通過觀察值事件讀取串列的檔案中所示:
rootNodeReference.observe(.value) { snapshot in
for child in snapshot.children {
...
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325776.html
標籤:
上一篇:react firebase:用useContext管理用戶資料
下一篇:Firebase沒有創建新用戶
