swift - 如何快速获取 Firebase 数据作为模型?
问题描述
我正在尝试从 firebase 获取数据并将其用作我创建的模型。
这是我的模型;
class UserData{
var nickname : String = ""
var onesignal_player_id : String = ""
var step_count : Int = 0
var total_point : Int = 0
var competitions : [String:Competition] = [String:Competition]()
}
class Competition{
var end_date : String = ""
var gift : String = ""
var id: String = ""
var name: String = ""
var users : [String:Int] = [:]
}
这是我的职责;
func getFirebaseData() {
ref = Database.database().reference()
ref.child("users").child("HXXNCXf6RRS4WVO12shZ3j15BnG3").observe(.value) { (snapshot) in
if let snapshotValue = snapshot.value as? Dictionary<String,Any> {
//change userData with the snapshotValue
self.userData.nickname = snapshotValue["nickname"] as! String
self.userData.step_count = snapshotValue["step_count"] as! Int
self.userData.total_point = snapshotValue["total_point"] as! Int
self.userData.onesignal_player_id = snapshotValue["onesignal_player_id"] as! String
self.userData.competitions = snapshotValue["competitions"] as! [String:Competition]
//reload UI with userData
print(self.userData.competitions)
} else {
print("An error occured while assigning snapshotValue to userData")
}
}
}
这段代码给了我这样的错误;
无法将类型“__NSDictionaryM”(0x1f47ada20)的值转换为“StepCounterApp.Competition”(0x1004c06f0)。2021-01-02 23:05:49.985711+0300 StepCounterApp[32511:3685645] 无法将“__NSDictionaryM”(0x1f47ada20)类型的值转换为“StepCounterApp.Competition”(0x1004c06f0)。
但是当我注释掉函数中包含的行时self.userData.competitions
,getFirebaseData
一切正常。
我应该怎么办?如何使用 Firebase 数据作为模型?
最后这是我的火力基础数据;
解决方案
问题出在您的数据模型中。像这样声明你的模型数据
class UserData {
var nickname : String = ""
var onesignal_player_id : String = ""
var step_count : Int = 0
var total_point : Int = 0
var competitions : Competition = Competition()
}
class Competition{
var end_date : String = ""
var gift : String = ""
var id: String = ""
var name: String = ""
var users : [String:Int] = [:]
init() {
}
init(with dictionary: [String: Any]) {
self.end_date = dictionary["end_date"] as! String
self.gift = dictionary["gift"] as! String
self.id = dictionary["id"] as! String
self.name = dictionary["name"] as! String
self.users = dictionary["users"] as! [String:Int]
}
}
在getFirebaseData
函数内部
self.userData.competitions = Competition(with: snapshotValue["competitions"] as! [String: Any])
推荐阅读
- dart - 如何在飞镖(颤振应用程序)中使用传递的数据编写if else语句
- python - pygame中的再次播放按钮
- postgresql - 将 postgis 线串与 GPS 日志匹配的有效方法
- python - 如何在 Python 中为 DataFrame groupby 动态提供值变量?
- android - 构建过程因无效数据而失败,块必须是字符串或缓冲区,而不是对象
- python - 无法使用 Firefox WebDriver 打开新标签页
- webhooks - Slack Incoming Webhook 作为我的用户发送
- laravel - Laravel Scout 队列性能
- c# - Web api 上的 Azure 预热不起作用
- python - 用德语月份名称解析日期