Попытка получить данные из Firebase Swift - PullRequest
0 голосов
/ 24 октября 2018

Хорошо, у меня есть функция, которая должна находить среднее значение оценок, поэтому я храню общее количество оценок и общую сумму оценок в моей базе данных (которая отлично работает).Я пытаюсь получить данные, но кажется, что они даже не входят в кодовый блок .observeSingleEvent. Я использую тот же подход при попытке обновить значения, что означает, что я получаю их и добавляю к ним новый рейтинги затем я использую приведенный ниже код для обновления значений:

let ratingObject = [
   "uid" : (user?.uid)! as String,
   "totalRatings" : newRating as Int,
   "amountOfRatings" : newAmountOfRating as int
   ] as [String : Any]

dbRef.setValue(ratingObject)

Это не выдает ошибку, и я просто потерялся

Я пытался сделать это на основе этого урока: https://www.youtube.com/watch?v=JV9Oqyle3iE

Ответы, приведенные в этой теме: как анализ данных Firefox FDatasnapshot json в swift просто приводит к сбою приложения

private func FindAverage(uid: String) -> Int {

    var totalRatings = 0
    var amountOfRatings = 1
    let dbRef = Database.database().reference().child("ratings").child(uid)

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

        let dict = snapshot.value as? [String:Any]
        totalRatings = dict?["totalRatings"] as? Int ??  0
        amountOfRatings = dict?["amountOfRatings"] as? Int ??  1

    }){ (error) in
        print(error.localizedDescription)
    }

    return((Int)(totalRatings/amountOfRatings))
}

Структура базы данных enter image description here

Любые советы и помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Попробуйте код ниже:

private func FindAverage(uid: String) -> Int {
  var totalRatings = 0
  var amountOfRatings = 1
  let dbRef = Database.database().reference().child("ratings").child(uid)
  dbRef.observeSingleEvent(of: .value, with: { snapshot in
     if snapshot.exists() {
        guard let dict = snapshot.value as? [String: Any] else {
           return
        }
        totalRatings = dict?["totalRatings"] as? Int ??  0
        amountOfRatings = dict?["amountOfRatings"] as? Int ??  1
     }
   }){ (error) in
      print(error.localizedDescription)
   }
   return((Int)(totalRatings/amountOfRatings))
}
0 голосов
/ 24 октября 2018

Вы пытаетесь вернуть значение из обработчика завершения.

Ваша функция должна выглядеть следующим образом:

private func findAverage(byUid uid: String, completion: @escaping (_ average: Int) -> Void) {
    // ...
    dbRef.observeSingleEvent(of: .value, with: { snapshot in
        guard let dict = snapshot.value as? [String: Any] else {
            return
        }
        totalRatings = dict["totalRatings"] as? Int ?? 0
        amountOfRatings = dict["amountOfRatings"] as? Int ?? 1

        completion((Int)(totalRatings / amountOfRatings))
    })
}

Примерно так: проверьте документы Swift (об обработчиках завершения и т. Д.).

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