我正在使用Firebase数据库,并尝试使用NSObject检索和使用数据。运行应用程序导致崩溃时,我收到NSUnknownKeyException错误。
NSObject:
class WatchList: NSObject {
var filmid: Int?
}
Firebase代码:
ref.child(“用户”).child(uid!)。child(“监视列表”).observe(DataEventType.childAdded,其中:{(info)in
print(info)
if let dict = info.value as? [String: AnyObject] {
let list = WatchList()
list.setValuesForKeys(dict)
print(list)
}
}, withCancel: nil)
我不确定是什么原因造成的。
还可以增强此解决方案的一种方法是获取这些数据,而不是使用NSObject而是将Codable和JSONDecoder与Firebase数据一起使用?
答案 0 :(得分:2)
在这里使用的一个非常好的库是Codable Firebase,我也在我的项目中使用它。只需使您的类/结构符合Codable
协议,然后使用FirebaseDecoder将Firebase数据解码为Swift对象即可。
示例:
Database.database().reference().child("model").observeSingleEvent(of: .value, with: { snapshot in
guard let value = snapshot.value else { return }
do {
let model = try FirebaseDecoder().decode(Model.self, from: value)
print(model)
} catch let error {
print(error)
}
})
答案 1 :(得分:0)
您可以简单地使用JSONSerialization将快照值属性从areT_v
转换为template <typename T, typename ...Ts>
inline constexpr bool areT_v = std::conjunction_v<std::is_same<T,Ts>...>;
static_assert( areT_v<int,int,int,int>);
static_assert(!areT_v<int,int,int,char>);
:
Any
您还可以扩展Firebase DataSnapshot类型并为其添加数据和json字符串属性:
Data
用法:
let data = try? JSONSerialization.data(withJSONObject: snapshot.value)