基本上所有的东西都在工作,但由于保护措施catData = Category(snapshot:catInfo),showChild函数返回了completion([])。我想知道为什么后卫让他返回完成状态。当我调试时,catInfo确实有1个值,如我的数据库图片所示,我想将catData.main附加到“ cats”上。下面是服务方法和类别模型的代码。
static func showChild(completion: @escaping ([String]) -> Void) {
let ref = Database.database().reference().child("category").child(User.current.uid)
ref.observeSingleEvent(of: .value, with: { (snapshot) in
guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
return completion([])
}
var cats = [String]()
for catInfo in snapshot {
guard let catData = Category(snapshot: catInfo) else {
return completion([])
}
cats += catData.main
}
completion(cats)
})
}
import Foundation
import FirebaseDatabase.FIRDataSnapshot
class Category {
var key: String?
let main: [String]
init?(snapshot: DataSnapshot) {
guard !snapshot.key.isEmpty else {return nil}
if let dict = snapshot.value as? [String : Any]{
let main = dict["main"] as? [String]
self.key = snapshot.key
self.main = main ?? [""]
}
else{
return nil
}
}
}
答案 0 :(得分:0)
问题很简单。
尽管快照至少包含一个数据节点,但其格式不是Category init方法可以理解的格式。您正在遍历它的子节点,并且在屏幕截图中,只有一个,其键为“ main”
您正在观察该节点
fb_root
category
2ayHe...
然后您要遍历的子节点
main
0: Performance
所以键是'main'并且它的值是'0:Performance'
但是您的Category类正在寻找'main'的子节点
let main = dict["main"] as? [String]
没有足够的信息来理解结构其余部分中包含的内容,因此我无法告诉您如何更正它,但至少您知道问题出在何处。
为澄清起见,此行
if let dict = snapshot.value as? [String : Any]
将使dict = [0:“效果”