Firebase快照未显示数据

时间:2019-06-22 20:44:38

标签: swift firebase firebase-realtime-database

基本上所有的东西都在工作,但由于保护措施catData = Category(snapshot:catInfo),showChild函数返回了completion([])。我想知道为什么后卫让他返回完成状态。当我调试时,catInfo确实有1个值,如我的数据库图片所示,我想将catData.main附加到“ cats”上。下面是服务方法和类别模型的代码。

Firebase Database

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
        }
    }
}

1 个答案:

答案 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:“效果”