[英]How to Parse a Single Dictionary from Firebase Snapshot?
我的代碼是:
_ = DataService.ds.REF_POSTS.child(key!).observe(.value, with: { (snapshot) in
})
該key
等於后置密鑰(-Kef2J6vJBCjHGYjSlkI)。 我想一次只檢索一個元素。
該孩子下只有一本字典:
我需要根據此內容創建一個字典。 但是,當我實現常規算法時:
_ = DataService.ds.REF_POSTS.child(key!).observe(.value, with: { (snapshot) in
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshot {
print("Zhenya: here is the snap: \(snap)")
if let postDict = snap.value as? Dictionary<String, AnyObject> {
let key = snap.key
let post = Post(postKey: key, postData: postDict)
self.posts.append(post)
} else {
print("Zhenya: failed to convert")
}
}
}
})
'snap'打印字典本身的元素,而不是整個字典。 因此,它總是在下一行中使轉換失敗。
忍者獎勵:
如果您可以提出更好的架構,我將不勝感激。 似乎一個接一個地從FB檢索帖子會大大降低性能。
之所以“一對一”,是因為這篇文章是用戶的GeoFire規范的結果。 Geofire將密鑰返回到附近的帖子。 我想根據返回的鍵篩選Firebase帖子的主分支,但是沒有辦法-只能一一加載(.orderByChild-不返回帖子,而是訂購所有帖子。如果您知道如何對我有幫助,請指教)
這是您的問題中提供的代碼:
_ = DataService.ds.REF_POSTS.child(key!).observe(.value, with: { (snapshot) in
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshot {
print("Zhenya: here is the snap: \(snap)")
if let postDict = snap.value as? Dictionary<String, AnyObject> {
let key = snap.key
let post = Post(postKey: key, postData: postDict)
self.posts.append(post)
} else {
print("Zhenya: failed to convert")
}
}
}
})
讓我們看看這里發生了什么。
第一行是使用.value
方法觀察Firebase中的posts/$post-id
。 .value
方法返回您在FIRDataSnapshot
提供的FIRDataSnapshot
,其中snapshot.key
是子項的名稱, snapshot.value
是包含其子項的字典。
因此, snapshot
中DataService.ds.REF_POSTS.child(key!).observe(.value, with: { (snapshot) in ... })
應該是這樣的:
$post-id
imageUrl: http://...
likes: 0
userKey: ...
但是在下一行,您將使用本地定義重新定義snapshot
。 這就是為什么要獲得該職位的孩子的原因,因為您以這種方式明確定義了該職位:
if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { ... }
如果刪除此,您應該看到所需的行為。
那你到底應該怎么做? 我不喜歡使用.value
因為它有一些缺點:
它下載請求的整個節點。 如果您將大型節點(例如ref / users)的引用弄亂了,那么.value
操作很容易花幾秒鍾才能看到任何數據。
它僅被調用一次。 如果您的數據庫是靜態的,但誰的數據庫是靜態的,那很好。
這就是為什么我更喜歡將.childAdded
用於帖子,消息等之類的原因。它一次返回一個節點,這意味着您可以在有新數據可用時逐步填充列表。 使用一些巧妙的UI函數(例如tableView.insertRows(...)
您可以相當平滑地顯示大數據列表,而無需等待結果。我相信它也支持分頁,例如,您可以分批獲取10個。 這是有關如何開始使用.childAdded
來充分利用大型數據列表的快速入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.