在函数外部获取let值

时间:2017-05-13 23:39:52

标签: swift firebase firebase-realtime-database let

您好我是swift编程的新手,我想从label获取loadData()值,以便在dbRef!.child(place+"/placeLabel")上使用我的路径(引用)到我的数据库。我的意思是说?!我读取“Dio Con Dio”节点上的数据。这是因为值placelet place = "Dio Con Dio"。因此,我的应用程序不会从“Paradosiako - Panorama”节点加载数据。我想从数据库加载所有内容,我认为如果我可以使place值更改为下一个节点,它可以读取所有数据。

    import UIKit
    import FirebaseDatabase

    class PlacesTableViewController: UITableViewController {

        //MARK: Properties
        @IBOutlet weak var placesTableView: UITableView!

        //database reference
        var dbRef:FIRDatabaseReference?

        var places = [Places]()

        private var loadedLabels = [String: String]()
        private var loadedRatings = [String: Int]()

        //handler
        var handle:FIRDatabaseHandle?

        override func viewDidLoad() {
            super.viewDidLoad()

            dbRef = FIRDatabase.database().reference()

            // Loads data to cell.
            loadData()
        }

                private func loadData() {

                let place = "Dio Con Dio"

                dbRef!.child(place+"/placeLabel").observe(.childAdded, with: {
                    (snapshot) in
                    let label = snapshot.value as! String
                    self.updatePlace(snapshot.key, label: label)
                })
                dbRef!.child(place+"/rating").observe(.childAdded, with: {
                    (snapshot) in
                    let rating = snapshot.value as! Int
                    self.updatePlace(snapshot.key, rating: rating)
                })


            }

            private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) {
                if let label = label {
                    loadedLabels[key] = label
                }
                if let rating = rating {
                    loadedRatings[key] = rating
                }
                guard let label = loadedLabels[key], let rating = loadedRatings[key] else {
                    return
                }
                if let place = Places(name: label, rating: rating) {
                    places.append(place)
                    placesTableView.reloadData()
                }
            }
        }

**My Database**

(这个问题是后续行动from this one。)

2 个答案:

答案 0 :(得分:3)

很难在评论中解释这一点,所以我会在这里解决你当前的问题,但我相信保罗回答了你的问题。你甚至可以就这个问题打开一个新问题。

以下是您遇到问题的代码:

SELECT color
     , count(*) as Total
     , sum(case when code > 0 and code <= 500  then 1 else 0 end) as cnt 
FROM  colors 
GROUP BY color 
ORDER BY cnt desc;

此代码没有任何问题,只要ratings.value填充字符串:整数对。您的错误发生是因为某种程度上缺少密钥。 (运行时发现了NSNull,因此无法将数据转换为字典)

您需要在以下位置设置断点来构建数组:

for (key, rating) in ratings.value as! [String: Int] {
            self.updatePlace(key, rating: rating)
        }

(在这里称为评级/本地)。如果可以忽略没有键的条目,则跳过它们,不要将它们附加到数组中。但是你更有可能出现错误并且需要找出你为什么要添加空值...

这更有意义吗?如果他解决了问题,请接受Paulo的回答,并打开一个新问题,其中包含有关childSnapshot(代码)的更多信息,并且有人会帮助您。 (我知道我会试试。)

答案 1 :(得分:2)

对于 new 数据库架构,请尝试以下方法:

private func loadData() {
    dbRef!.observe(.childAdded) {
    (placeSnapshot) in
        print("Adding place \(placeSnapshot.key)...")

        // Load each label on the "placeLabel" list. 
        let labels = placeSnapshot.childSnapshot(forPath: "placeLabel")
        for (key, label) in labels.value as! [String: String] {
            self.updatePlace(key, label: label)
        }

        // Load each rating in the "rating" list. 
        let ratings = placeSnapshot.childSnapshot(forPath: "rating")
        for (key, rating) in ratings.value as! [String: Int] {
            self.updatePlace(key, rating: rating)
        }
    }
}

updatePlace功能只是分组给定地点的标签和评级属性,由loadData单独加载。

删除地点。当然,上面的代码不会处理删除位置。为此,您还需要收听childRemoved事件。