Вернуть int из базы данных Firebase в реальном времени в Swift 5 - PullRequest
0 голосов
/ 28 января 2020

Я делаю это приложение, где пользователи могут дать отзыв о резюме других пользователей. Я храню отзывы в базе данных Firebase в реальном времени. В моем FeedbackViewController у меня есть просмотр таблицы, и мне нужно получить доступ к totalFeedbackNum в моей базе данных, чтобы заполнить мой просмотр таблицы, однако я получаю сообщение об ошибке. Приведенный ниже код комментирует то, каким должен быть код, но он выдает ошибку: Неожиданное возвращаемое значение в void функции.

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

//        var ref: DatabaseReference!
//        ref = Database.database().reference()
//        let uid = Auth.auth().currentUser?.uid
//        ref.child("usernames/\(uid!)/profile/feedback/totalFeedbackNum").observeSingleEvent(of: .value, with: { (snapshot) in
//            let value = snapshot.value as? NSDictionary
//            let totalFeedbackNum = value?["totalFeedbackNum"] as? Int ?? 0
//            return totalFeedbackNum //this throws "Unexpected non-void return value in void function"
//        }) { (error) in
//            print(error.localizedDescription)
//        }

        let totalFeedbackNum = 3
        return totalFeedbackNum
    }

Я думаю, что я должен использовать обработчик завершения, но я не знаю как. Я работаю со Swift 5.

Редактировать: я перешел по первой ссылке в комментариях и получил это, но все еще не работает:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        let uid = Auth.auth().currentUser?.uid
        var ref: DatabaseReference!
        ref = Database.database().reference()
        var totalFeedbackNum = 1
        print("Starting observing")
        ref.child("usernames/\(uid!)/profile/feedback/totalFeedbackNum").observe(.value, with: { (snapshot: DataSnapshot!) in
            print("Got snapshot")
            let value = snapshot.value as? NSDictionary
            totalFeedbackNum = value?["totalFeedbackNum"] as? Int ?? 0
        })
        print("Returning totalFeedbackNum: \(totalFeedbackNum)");
        return totalFeedbackNum
    }

Этот код печатает: Начало наблюдения Returning totalFeedbackNum : 1 Начало наблюдения Возврат totalFeedbackNum: 1 Получил снимок Получил снимок

1 Ответ

0 голосов
/ 28 января 2020

Хорошо, так что я понял это. Как указал Вадиан, мне нужно было объявить глобальную переменную totalFeedbackNum, которую я изначально установил на 0. В viewDidLoad выполните следующие действия:

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self

        let uid = Auth.auth().currentUser?.uid
        var ref: DatabaseReference!
        ref = Database.database().reference()

        ref.child("users/\(uid!)/profile/feedback/totalFeedbackNum").observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            self.totalFeedbackNum = value?["totalFeedbackNum"] as? Int ?? 0
            self.tableView.reloadData()
        }) { (error) in
            print(error.localizedDescription)
        }
    }

Надеюсь, это кому-нибудь поможет. Ура, Джек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...