New*_*bie 2 ios firebase swift firebase-realtime-database
我正在使用 Firebase 实时数据库,在 swift 和外部库 CodableFirebase 中使用可编码方法。我已经创建了模型结构,但是当我尝试使用模型结构解析值(因为我正在获取所有值)时,它给了我零。我的数据库有键,我可能没有正确处理嵌套值。请帮忙。谢谢
附上数据库结构快照。
代码:
Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
guard let value = snapshot.value as? [String: Any] else { return }
do {
let friendList = try FirebaseDecoder().decode(Response.self, from: value)
guard let conversationUid = value["conversationUid"] as? String,
let friendStatus = value["friendStatus"] as? String,
let notify = value["notify"] as? Bool,
let phNumber = value["phoneNumber"] as? String,
let uid = value["uid"] as? String
else { return }
} catch let error {
print(error)
}
})
Run Code Online (Sandbox Code Playgroud)
JSON:
{
"FTgzbZ9uWBTkiZK9kqLZaAIhEDv1" : {
"friends" : {
"zzV6DQSXUyUkPHgENDbEjXVBj2" : {
"conversationUid" : "-L_w2yi8gh49GppDP3r5",
"friendStatus" : "STATUS_ACCEPTED",
"notify" : true,
"phoneNumber" : "+9053",
"uid" : "zzV6DQSXUyUkPHgEZ9EjXVBj2"
}
},
"lastLocation" : {
"batteryStatus" : 22,
"latitude" : 48.90537,
"longitude" : 28.042,
"timeStamp" : 1556568633477,
"uid" : "FTgzbZ9uWkiZK9kqLZaAIhEDv1"
},
"profile" : {
"fcmToken" : "fp09-Y9ZAkQ:APA91bFgGBsyFx0rtrz7roxzpE_MmuSaMc4is-XIu7j718qjRVCSHY4PvbNjL1LZ-iytaeDKviIRMH",
"name" : "Mt Bt",
"phoneNumber" : "+90503",
"uid" : "FTgzbZ9uWBTkiZLZaAIhEDv1"
}
}
Run Code Online (Sandbox Code Playgroud)
模型:
struct Response : Codable {
let friends : Friend?
let lastLocation : LastLocation?
let profile : Profile?
}
struct Friend: Codable {
let converstionUid: String?
let friendStatus: String?
let notify: Bool?
let phoneNumber: String?
let uid: String?
}
struct Profile : Codable {
let fcmToken : String?
let name : String?
let phoneNumber : String?
let uid : String?
}
struct LastLocation : Codable {
let batteryStatus : Int?
let latitude : Float?
let longitude : Float?
let timeStamp : Int?
let uid : String?
}
Run Code Online (Sandbox Code Playgroud)
您的代码正在读取整个users节点,然后尝试conversationUid从该节点读取和其他属性。由于这些属性不直接users存在于node 下,因此您将获得 null。
要正确解析此 JSON,您需要在尝试读取命名属性(如conversationUid.
Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
for userSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
let friendsSnapshot = userSnapshot.childSnapshot(forPath: "friends")
for friendSnapshot in friendsSnapshot.children.allObjects as! [DataSnapshot] {
guard let value = friendSnapshot.value as? [String: Any] else { return }
do {
guard let conversationUid = value["conversationUid"] as? String,
...
Run Code Online (Sandbox Code Playgroud)
上面的代码首先循环遍历 下的一级子节点/users,然后循环遍历friends每个用户的节点的子节点。
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |