我正在尝试从Firebase DataSnapshot解码数据,以便可以使用JSONDecoder解码数据。

当我使用URL通过网络请求(获取Data对象)访问数据时,可以很好地解码该数据。

但是,我想使用Firebase API通过this page上描述的observeSingleEvent直接获取数据。

但是,当我这样做时,似乎无法将结果转换为Data对象,而我需要使用JSONDecoder。

是否可以使用DataSnapshot进行JSON解码的新样式?这怎么可能?我似乎无法弄清楚。

最佳答案

我创建了一个名为CodableFirebase的库,该库提供了专为Firebase设计的EncodersDecoders

因此,对于上面的示例:

import Firebase
import CodableFirebase

let item: GroceryItem = // here you will create an instance of GroceryItem
let data = try! FirebaseEncoder().encode(item)

Database.database().reference().child("pathToGraceryItem").setValue(data)

以下是读取相同数据的方式:
Database.database().reference().child("pathToGraceryItem").observeSingleEvent(of: .value, with: { (snapshot) in
    guard let value = snapshot.value else { return }
    do {
        let item = try FirebaseDecoder().decode(GroceryItem.self, from: value)
        print(item)
    } catch let error {
        print(error)
    }
})

10-08 07:06
查看更多