Проблема с быстрым получением дочернего узла firebase

Xcode 9 - Свифт 4

Разрешения для данных Firebase не установлены — чтение/запись для всех

Я импортировал данные json в firebase, и мои данные выглядят так.

введите здесь описание изображения

Я пытаюсь перейти к заголовку заданий, перечисленных в базе данных 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!
    }


}

person ibrahim Akar    schedule 28.09.2017    source источник
comment
в чем проблема?   -  person matiastofteby    schedule 28.09.2017
comment
@ibrahim Akar Я отредактировал свой ответ, попробуйте   -  person Rendel    schedule 28.09.2017
comment
Большое спасибо за вашу помощь @matias .. это не только привело меня в нужное место, я действительно многому научился .. есть одна вещь, которой не хватало .. ребенок должен был быть выбран для ребенка в snapshot.children.allObjects в качестве! [Снимок данных]{   -  person ibrahim Akar    schedule 02.10.2017


Ответы (1)


При использовании child() вы перемещаетесь только на один уровень вниз по дереву за раз. Поскольку у вас много позиций, вы не можете просто получить доступ к титулам с помощью child("title").

При вызове наблюдатьSingleEvent вы ищете значения ключа, который вы указали в своей ссылке на базу данных.

Как написано ниже, вы получаете снимок всех значений под ключом «positions». Поэтому вы используете цикл for для доступа к значению «заголовок» каждого отдельного объекта.

Вы должны написать его как отдельную функцию и вызывать из viewDidLoad(), а не писать код firebase внутри самого viewDidLoad.

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()
        })
    }
}
person matiastofteby    schedule 28.09.2017
comment
Даже если вы правы в том, что вы сказали, вы на самом деле не показали ему, что он сделал неправильно. Фактическая проблема заключается в том, что он использует DataEventType. Вместо использования .childAdded он должен использовать .value. - person Massimiliano Del Maestro; 28.09.2017
comment
@MassimilianoDelMaestro Ты прав. Я отредактирую свой ответ. - person matiastofteby; 28.09.2017
comment
Я использовал функцию, предложенную matiastofteby - спасибо // Перебираем все ваши позиции для ребенка в snapshot.children { Я получаю сообщение об ошибке: неизменяемое значение 'child' никогда не использовалось; рассмотрите возможность замены на «_» или его удаление — данные не возвращаются - person ibrahim Akar; 28.09.2017
comment
Извините, я обновил его сейчас. Также измените userInfo на positionsInfo - person matiastofteby; 28.09.2017
comment
Теперь я допустил одну ошибку в этой строке. let positionInfo = child.value as! [Строка: Any] Ошибка: значение типа Any не имеет члена value. Приведите Any к AnyObject или используйте as! чтобы принудительно преобразовать в более конкретный тип для доступа к членам - person ibrahim Akar; 29.09.2017
comment
Извините, я писал весь код прямо здесь, в браузере, поэтому кое-что пропустил. Я думаю, теперь все должно быть в порядке. - person matiastofteby; 02.10.2017
comment
Большое спасибо за вашу помощь @matiastofteby .. это не только привело меня в нужное место, но я также многому научился .. есть одна вещь, которой не хватало .. ребенок должен был быть брошен как ребенок в snapshot.children. всеОбъекты как! [Снимок данных]{ - person ibrahim Akar; 02.10.2017
comment
@ibrahimAkar рад, что смог помочь - я обновил ответ в последний раз! Если вы считаете, что это того стоит, рассмотрите возможность пометить ответ как принятый ответ :=) - person matiastofteby; 02.10.2017