То, что вы видите, - это ожидаемое поведение.observeReady
гарантированно сработает после того, как все соответствующие observe(.keyEntered)
были вызваны.Вы можете проверить это с помощью нескольких простых инструкций регистрации:
query.observe(.keyEntered) { (key: String!, venueLocation: CLLocation!) in
print(".keyEntered")
}
query.observeReady {
print(".observeReady")
}
Когда вы запустите это, он напечатает:
.keyEntered
.keyEntered
...
.observeReady
Это соответствует тому, как должен работать API.Но в .keyEntered
вы загружаете дополнительные данные из Firebase, что происходит асинхронно.И эти вызовы могут действительно завершиться после , когда .observeReady
сработал.
Так что вам нужно будет выполнить необходимую синхронизацию самостоятельно.Простой способ определить, загрузили ли вы все дополнительные данные, - это вести учет всех ключей, для которых вам все еще нужно загрузить данные.Таким образом, вы +1
это каждый раз, когда вы добавляете ключ, и -1
каждый раз, когда вы загружаете данные места:
let venuesToLoadCount = 0
query.observe(.keyEntered) { (key: String!, venueLocation: CLLocation!) in
venuesToLoadCount = venuesToLoadCount + 1
self.REF_VENUES.child(key).observeSingleEvent(of: .value, with: { (snapshot) in
venuesToLoadCount = venuesToLoadCount - 1
if venuesToLoadCount == 0 {
print("All done")
}
}
}
query.observeReady {
if venuesToLoadCount == 0 {
print("All done")
}
}