【发布时间】:2021-01-03 05:56:14
【问题描述】:
我正在尝试从 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)。
但是当我从 getFirebaseData 函数中注释掉包含 self.userData.competitions 的行时,一切正常。
我该怎么办?如何使用 Firebase 数据作为模型?
最后是我的 firebase 数据;
【问题讨论】:
-
不清楚它在 competitions 中存储的是 Firebase 数组,例如比赛/0、比赛/1、比赛/2等?如果是这样,您可能想重新考虑将结构作为数组在 RTDB 中使用具有挑战性,并且可能有更好的结构。此外,如果您想更新 users 中的任何子数据,您将需要在 Swift 模型中包含节点键,以便知道数据属于哪个节点。另外,您为什么要存储比赛为
[String:Competition]?串起来没必要,多点比赛就好了。
标签: swift firebase model nsdictionary encodable