发出检索firebase子节点swift的问题

时间:2017-09-28 14:57:22

标签: json swift firebase firebase-realtime-database swift4

Xcode 9 - Swift 4

没有在Firebase数据上设置权限 - 读/写所有人

我将json数据导入firebase,我的数据看起来像这样..

enter image description here

我正在尝试查看FireBase数据库中列出的作业的标题,将标题列表放在一个数组中并放入tableView中它不会返回任何内容 我的快速代码看起来像这样..

import UIKit
import FirebaseDatabase


class PostViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var jobPostsTableView: UITableView!

    var ref: DatabaseReference?
    var databaseHandle: DatabaseHandle = 0


    var searchJSONQuery : String = ""

    var jobsData = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        jobPostsTableView.delegate = self
        jobPostsTableView.dataSource = self

        //Set the Firebase Reference
        ref = Database.database().reference()



    // Retreive the posts and listen for changes
        databaseHandle = (ref?.child("positions/title").observe(.childAdded, with: { (snapshot) in
            //Code to execute when a child is added under "positions"
            //Take the value from the snapshot and add it to the jobsData array

            let list = snapshot.value as? String

            if let actualList = list {
                self.jobsData.append(actualList)
                self.jobPostsTableView.reloadData()
            }

        }))!


}
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jobsData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell")
        cell?.textLabel?.text = jobsData[indexPath.row]
        return cell!
    }


}

1 个答案:

答案 0 :(得分:2)

使用child()时,您只能在树下一层。由于您有很多职位,因此无法使用child("title")简单地访问这些职位。

调用observeSingleEvent时,您正在寻找您在数据库引用中声明的密钥的

通过下面的方式,您可以获得“位置”键下方所有值的快照。因此,您使用for循环访问每个对象的“title”值。

您应该将其作为单独的函数编写,并从viewDidLoad()调用它,而不是在viewDidLoad本身内写入firebase代码。

func retrieveJobTitles(){

        let positionRef = ref.child("positions")

        positionsRef.observeSingleEvent(of: .value, with: { (snapshot) in

            // Iterate through all of your positions
            for child in snapshot.children.allObjects as! [DataSnapshot] {

               let position = child as! DataSnapshot

               let positionsInfo = position.value as! [String: Any]

               let jobTitle = positionsInfo["title"] as! String

               if jobTitle != nil {
                  self.jobsData.append(jobTitle)
               }
            }

            self.jobPostsTableView.reloadData()
        })
    }
}