Swift Firebase 读取孩子的孩子

ran*_*234 0 firebase swift firebase-realtime-database swift4

所以我试图读取下面“食谱”下的 autoID 子项的子项是我的 Firebase 数据库的图片,下面是应该检索“描述”和“名称”的值并将它们插入到变量中的方法.

我目前在运行应用程序时遇到的错误是:

Could not cast value of type '__NSCFString' (0x10ad2afb8) to 'NSDictionary' (0x10ad2bfa8).
Run Code Online (Sandbox Code Playgroud)

我的 Firebase 数据库

    ref = Database.database().reference()

    databaseHandle = ref?.child("Recipes").observe(.childAdded) { (snapshot) in

        for snap in snapshot.children
        {
            let recipeSnap = snap as! DataSnapshot
            let recipeID = recipeSnap.key
            let dict = recipeSnap.value as! [String:AnyObject]
            let recipeName = dict["Name"] as! String
            let recipeDescription = dict["Description"] as! String
            print("key = \(recipeID) and name = \(recipeName) and description = \(recipeDescription)")
        }
  }
Run Code Online (Sandbox Code Playgroud)

打印语句仅用于测试。

j__*_*__j 5

尝试以下操作,让我知道它现在是否有效:

// SEARCHES FOR SHARING CODE IN DATABASE (ONLINE)
let parentRef = Database.database().reference().child("Recipes")

parentRef.observeSingleEvent(of: .value, with: { snapshot in

    // SHOWING WHATEVER WAS RECEIVED FROM THE SERVER JUST AS A CONFIRMATION. FEEL FREE TO DELETE THIS LINE.
    print(snapshot)

    // PROCESSES VALUES RECEIVED FROM SERVER
    if ( snapshot.value is NSNull ) {

       // DATA WAS NOT FOUND
       print("– – – Data was not found – – –")

    } else {

        // DATA WAS FOUND
        for user_child in (snapshot.children) {

            let user_snap = user_child as! DataSnapshot
            let dict = user_snap.value as! [String: String?]

            // DEFINE VARIABLES FOR LABELS
            let recipeName = dict["Name"] as? String
            let recipeDescription = dict["Description"] as? String
            print("– – – Data for the recipe \(recipeName) with the description \(recipeDescription) was found successfully! – – –")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想检索一个特定配方的名称和描述,则应将第三行更改为

parentRef.queryEqual(toValue:DefineWhatToSearchForHere).observeSingleEvent(of: .value, with: { snapshot in
Run Code Online (Sandbox Code Playgroud)

如果您不断想要更新以反映更改,您可以使用计时器每 x 秒调用一次此函数并将其添加到override func viewDidLoad()诸如

time = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(ViewController.updateFBData), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)

在创建一个被调用的函数func updateFBData()之后,你可以做任何你想做的事情来获取新数据(见上文)并以定义的方式调用它timeInterval

或者你可以在这个优秀的教程中做 Attila Hegedüs的事情。