Функция Firebase updateChildValues ​​блокирует другие функции Firebase - PullRequest
0 голосов
/ 30 апреля 2019

Я использую функцию updateChildValues ​​для обновления значений для 500 студентов в базе данных, когда я запускаю ее и пытаюсь вызвать другую функцию Firebase, такую ​​как наблюдение, вторая функция (наблюдение) не выполняет и продолжает ждать до первой операции (updateChildValues)) завершается, что занимает почти 15 секунд.

Это мой код для updateChildValues:

@IBAction func menu(_ sender: Any) {
        let storeRecord = UIAlertAction(title: "Store attendance record", style: .default) { action in
            var attendanceTimesDict = [String: Int]()
            var absenceTimesDict = [String: Int]()
            for student in self.students { // 500 students
                if self.attendanceRecord[student.identifier] == true {
                    student.attendanceCount += 1
                    attendanceTimesDict["\(student.identifier)/attendance"] = student.attendanceCount
                } else {
                    student.absenceCount += 1
                    absenceTimesDict["\(student.identifier)/absence"] = student.absenceCount
                }
            }
            Database.database().reference().child("class").child("CS101").child("records").child("27-4-2019").updateChildValues(self.attendanceRecord)
            Database.database().reference().child("class").child("CS101").child("students").updateChildValues(attendanceTimesDict)
            Database.database().reference().child("class").child("CS101").child("students").updateChildValues(absenceTimesDict)
        }
}

А это мой код для функции наблюдения:

func getStudentsList() {
        Database.database().reference().child("class").child("CS101").child("students").observeSingleEvent(of: .value) { snapshot in
            for child in snapshot.children.allObjects as! [DataSnapshot] {
                let studentObject = child.value as? [String: Any]
                if let name = studentObject?["name"] as? String {
                    let student = Student(identifier: child.key, name: name)
                    self.students.append(student)
                }
            }
          self.tableView.reloadData()
        }
}

1 Ответ

1 голос
/ 30 апреля 2019

Сервер базы данных Firebase Realtime выполняет одну операцию за раз, чтобы всегда возвращать согласованное состояние.

Если вы хотите, чтобы одна большая операция записи не блокировала другие операции в течение длительного времени, вы разделите эту большую операцию на несколько частей.

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