Это не будет полным ответом, но, возможно, даст вам правильное направление. В коде есть некоторые запутанные биты, поэтому я рассмотрю их, а затем, возможно, укажу лучшее направление ...
Вашей функции передана одна выбранная дата
func getCalendarSignupsOnDate(selectedDate: String
, что означает, что вы знаете узел даты, который вы пытаетесь прочитать. Однако код читает во ВСЕХ датах и перебирает их, пытаясь найти эту дату
for date in snapshot {
if date.key == selectedDate {
Вероятно, было бы гораздо меньше кода, чтобы просто напрямую прочитать этот узел, а затем работать с дочерними узлами внутри него.
Кроме того, далее в коде вы перебираете дочерние узлы A12-1A, B1-2A, ища конкретный узел
if let count = timeSlots.childSnapshot(forPath: "J9-10A").value as? Int
, который вообще не будет работать, поскольку временные интервалы A12-1A и т. Д. Имеют значения, все 0, а не дочерние снимки. Код продолжает и появляется, что вы хотите прочитать значение этого конкретного дочернего узла, а затем установить остальные 0, которые добавляются в ваш массив календаря.
let count = 0
let calendarData = Calendar(time: time, signupCount: count)
Но затем, если вы не найдете этот временной интервал, все дочерние узлы все равно будут установлены в 0.
if doesContainDate == false {
let dateSignUpData = [
"A12-1A": 0,
"B1-2A": 0,
Итак ... я думаю, что я понял суть того, что вы пытаетесь сделать. Вот некоторый код, который может привести вас в правильном направлении. Это должно заменить весь код в вашем вопросе.
func getCalendarSignupsOnDate(selectedDate: String) {
var dateSignUpData = [
"A12-1A": 0,
"B1-2A": 0,
"C2-3A": 0,
"J9-10A": 0
]
let slotYourLookingFor = "J9-10A"
let dateRef = self.REF_CALENDAR_SIGNUPS.child(selectedDate).child(slotYourLookingFor)
dateRef.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.exists() {
let count = snapshot.value as? Int ?? 0
dateSignUpData[slotYourLookingFor] = count //update this array element with the new count from Firebaes
} else { //didn't find the child node at all, will create the date node and add child nodes with val = 0
self.REF_CALENDAR_SIGNUPS.child(selectedDate).updateChildValues(dateSignUpData)
}
//do something with the dateSignUpData array
})
}
Пояснение:
Укажите дату, которая вас интересует. Код будет читать этот узел с дочерним узлом "J9-10A", который вы ищете.
Если он существует, он будет считывать эти данные и обновлять массив dateSignUpData со счетчиком из этого дочернего узла. Затем вы можете продолжить обработку обновленного массива.
Если узел "J9-10A" не существует, будет создан узел с переданной датой, а затем все слоты дочерних узлов будут установлены в 0. Затем вы можете обработать массив дальше.
Последнее. Вероятно, хорошая идея хранить даты как ггггммдд для заказа.