#firebase #firebase-realtime-database #swiftui
#firebase #firebase-realtime-database #swiftui
Вопрос:
У меня есть следующая структура базы данных Firebase в реальном времени:
posts: {
user1_uid: {
-Kfm0p2EMcrpN8XcLOR5: {
created_at: 1490119356.786182,
image_height: 374.9999999999999,
image_url: "ttps://firebasestorage.googleapis.com/v0/b/mak...",
like_count: 4,
poster: {
uid: user1_uid,
username: "testuser"
}
},
-KgGuLttcC3PJbD8pWAT: { ... },
-KgLo0OrineV8l3_K9gK: { ... }
},
user2_uid: { ... },
user3_uid: { ... }
}
со следующей структурой Post:
init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: AnyObject],
let uID = value["poster/uid"] as? String,
let userName = value["poster/username"] as? String,
let text = value["text"] as? String,
let likes = value["likes"] as? Int,
let created = value["created"] as? String,
let iHeight = value["imageheight"] as? Double,
let imageName = value["imagename"] as? String
else {
print("************************************************")
print("PostStore init?(snapshot: DataSnapshot) ERROR!!!")
print("************************************************")
return nil
}
self.id = snapshot.key
self.uID = uID!
self.userName = userName!
self.text = text!
self.created = created!
self.likes = likes!
self.iHeight = iHeight!
self.imageName = imageName!
}
когда я запускаю код, я всегда получаю else portion of the statement executed with the error
распечатанный?!
Я думаю, что проблема связана со следующим кодом:
let uID = value["poster/uid"] as? String,
let userName = value["poster/username"] as? String,
поскольку у этого есть дочерний узел. Я не уверен, как я могу получить доступ к этому узлу в информации?
Может кто-нибудь помочь, пожалуйста!
******* ОБНОВИТЬ ******
с другой стороны, как бы я записал в базу данных, которая у меня есть в настоящее время :
func toAnyObject() -> Any {
return [
"poster/username": userName,
"poster/uid": uID,
"text": text,
"created": created,
"likes": likes,
"imageheight": iHeight,
"imageName": imageName
]
}
как мне учитывать дочерний узел ‘poster’ при записи в firebase DB, поскольку использование /
символа завершается сбоем.
Ответ №1:
Итак, основываясь на моем вопросе из двух (2) частей; первоначально это был только один (1) вопрос, но он превратился в два (2) после того, как часть записи стала проблемой после того, как мне был предоставлен отличный ответ на первоначальный вопрос о чтении от Asperi.
Мой ответ включал его приведенный выше ответ, а затем я изменил остальные, чтобы соответствовать чтению и записи в Firebase.
struct Post: Identifiable {
var id: String
var profile: Profile?
var uID: String
var userName: String
var text: String
var created: String
var likes: Int
var iHeight: Double
var imageName: String
init(id: String, profile: Profile, text: String, created: String, likes: Int, iHeight: Double, imageName: String ) {
self.id = id
self.profile = profile
self.userName = profile.userName
self.uID = profile.uID
self.text = text
self.created = created
self.likes = likes
self.iHeight = iHeight
self.imageName = imageName
}
init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: AnyObject],
let poster = value["poster"] as? [String: AnyObject],
let uID = poster["uid"] as? String,
let userName = poster["username"] as? String,
let text = value["text"] as? String,
let likes = value["likes"] as? Int,
let created = value["created"] as? String,
let iHeight = value["imageheight"] as? Double,
let imageName = value["imagename"] as? String
else {
return nil
}
self.id = snapshot.key
self.uID = uID
self.userName = userName
self.text = text
self.created = created
self.likes = likes
self.iHeight = iHeight
self.imageName = imageName
}
func toAnyObject() -> Any {
return [
"poster": profile!.toAnyObject(),
"text": text,
"created": created,
"likes": likes,
"imageheight": iHeight,
"imagename": imageName
]
}
}
struct Profile: Codable {
let uID: String
let userName: String
func toAnyObject() -> Any {
return [
"uid": uID,
"username": userName
]
}
}
Надеюсь, это поможет другим.