Данные загружаются из Firebase асинхронно.Пока данные загружаются, остальная часть вашего кода продолжает выполняться.Затем, когда данные доступны, вызывается ваше замыкание (snapshot in
).
Код, который находит requestFoodNumberArray
пустым, просто запускается до , когда вызывается замыкание, итаким образом, requestFoodNumberArray
все еще пуст.
Вы можете легко убедиться в этом сами, добавив несколько простых операторов журнала:
print("Before attaching observer")
refRequest.child("\(requestFoodItemArray[i])").observe(.value, with: { snapshot in
print("Got data")
})
print("After attaching observer")
Если вы запустите этот код, вы получитеследующий вывод:
Перед присоединением наблюдателя
После присоединения наблюдателя
Получил данные
Это, вероятно, не тот порядок, в котором выожидал данных.Но это точно объясняет, почему массив является пустым в коде после закрытия, но за пределами закрытия: данные еще не были загружены.
Чтобы не было этой проблемы, весь код, который требует данные, должен быть(вызывается из) в закрытии.В качестве альтернативы (если вас устраивает низкоуровневая синхронизация), вы можете использовать примитивы синхронизации, чтобы сделать вызов после ожидания закрытия.
См .: