Вызовы 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
}
Другие вопросы по тегам