Срок службы хранимого контента в Firebase Observer - PullRequest
0 голосов
/ 26 декабря 2018

Привет У меня возникли трудности с получением значений массива внутри блока Firebase.

Мой код включает в себя определение количества заказанных продуктов питания (requestFoodItemArray [i]) и добавление их в массив (requestFoodNumberArray).Я могу заставить его успешно работать, но тогда значения, хранящиеся в requestFoodNumberArray, исчезнут, когда я попытаюсь получить к нему доступ где-либо еще, кроме как в блоке наблюдения ().

Как я могу "продлить" срок службы данных, хранящихся в этом конкретном массиве?

Спасибо!

 override func viewDidLoad() {
    super.viewDidLoad()

    populateCharts(completion: { requestNumberArray in
        print(requestNumberArray)
    })

}

func populateCharts (completion: @escaping (_ requestNumberArray: Array<Double>) -> Void)  {
    for i in 0 ..< requestFoodItemArray.count {
    refRequest.child("\(requestFoodItemArray[i])").observe(.value, with: { snapshot in
        var newItem: [FoodRequestItemList] = []
        for child in snapshot.children {
            if let snapshot = child as? DataSnapshot,
                let requestItemList = FoodRequestItemList(snapshot: snapshot) {
                newItem.append(requestItemList)
            }
        }
        self.item = newItem
        self.requestedItemArray = self.item.map({ $0.key })
        var arrayCount : Double = Double(self.requestedItemArray.count)
        var requestArray : [Double] = []
        requestArray.append(arrayCount)
        completion(requestArray)
    }, withCancel: nil)
}

1 Ответ

0 голосов
/ 26 декабря 2018

Данные загружаются из 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")

Если вы запустите этот код, вы получитеследующий вывод:

Перед присоединением наблюдателя

После присоединения наблюдателя

Получил данные

Это, вероятно, не тот порядок, в котором выожидал данных.Но это точно объясняет, почему массив является пустым в коде после закрытия, но за пределами закрытия: данные еще не были загружены.

Чтобы не было этой проблемы, весь код, который требует данные, должен быть(вызывается из) в закрытии.В качестве альтернативы (если вас устраивает низкоуровневая синхронизация), вы можете использовать примитивы синхронизации, чтобы сделать вызов после ожидания закрытия.

См .:

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