簡體   English   中英

如何從Firebase快照解析單個詞典?

[英]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是包含其子項的字典。

因此, snapshotDataService.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM