Получите начальные значения ключа от детей в Firebase, используя обработчик завершения IOS - PullRequest
0 голосов
/ 09 октября 2018

Я рассчитываю получить количество ключей, а затем значения ключей из списка ранее установленных данных в Firebase.Я пытаюсь полностью понять обработчики завершения, однако я еще не могу быть там.Почему это возвращает пустой массив?Или, по крайней мере, не заполняется данными до запуска следующей функции (вне этого кода)?Спасибо!

//Initial data download from Firebase
func getKeys(completion: @escaping () -> Void) {

    Database.database().reference().child("food").observe(.value) { (snapshot) in

            //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            self.onloadKeyArray.append(key)
        }

      }

    completion()
}

1 Ответ

0 голосов
/ 09 октября 2018

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

func getKeys(completion: @escaping () -> Void) {
    Database.database().reference().child("food").observe(.value) { (snapshot) in

        //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            self.onloadKeyArray.append(key)
        }
        completion()
      }
}

Кроме того, если вам понадобятся эти данные вне замыкания, было бы неплохопередайте его обработчику завершения, например:

func getKeys(completion: @escaping ([String]) -> Void) {

    keyArray = [String]()
    Database.database().reference().child("food").observe(.value) { (snapshot) in

        //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            keyArray.append(key)
        }
        completion(keyArray)
      }
}

Затем, когда вы вызовете функцию, у вас будет массив.Это позволяет вам отделить ваши функции данных от контроллеров представления.

yourClass.getKeys() { keyArray in
   self.keys = keyArray
}
...