Вызовы Firebase с PromiseKit/AwaitKit в Swift никогда не возвращаются
Подобно этому оставшемуся без ответа вопросу, я не смог использовать Firebase Auth и вызовы базы данных с Promise в Swift. Я могу использовать такие вызовы в обработчике завершения следующим образом (если обработчик завершения не находится в Promise):
Database.database().reference(withPath: "/Path/To/My/Data").observeSingleEvent(of: .value, with: { (result) in
// do things with the result
})
Но не так (я использую AwaitKit, чтобы дождаться выполнения обещания):
func getData(from path: String) -> Promise<DataSnapshot> {
let ref = Database.database().reference(withPath: path)
return Promise { (fulfill, reject) in
ref.observeSingleEvent(of: .value, with: { (result) in
fulfill(result) // this is never called
})
}
}
await(getData(from: "/Path/To/My/Data")) // this never completes
Когда я звоню await(getData(from: "/Path/To/My/Data"))
вызов никогда не завершается, а остальная часть кода после вызова никогда не выполняется. Та же проблема возникает при попытке аутентификации с использованием Auth.auth().signInAnonymously(completion:)
Способ; он прекрасно работает сам по себе, но никогда не возвращается, когда внутри обещания. После выполнения примерно минуты оба вызова автоматически завершаются следующим сообщением в консоли:
TIC TCP Conn Failed [6: 0x12190e8b0]: 3: -9802 Ошибка (-9802)
Я думаю, что проблема может заключаться в том, что AwaitKit использует семафоры, чтобы дождаться выполнения обещания, но я не совсем уверен.
Так как я могу успешно использовать Firebase из обещания? Спасибо за помощь!
1 ответ
Добавление async
вокруг await
вызов исправил мою проблему, вот так:
async {
await(getData(from: "/Path/To/My/Data"))
// continue execution
}