Swift Async/Await结合Firebase实时数据库:observeSingleEvent可行吗?
问题分析与修正方案
你给出的代码无法正常工作,核心问题有两点:
observeSingleEvent是基于闭包的异步API,闭包里的return只能终止闭包本身,没法把结果传递给getPromoCodes函数的调用者- 函数声明了
async throws,但当前代码既没正确抛出错误,也没返回符合要求的异步结果
要把回调式的Firebase API适配成Async/Await风格,需要用withCheckedThrowingContinuation做包装,下面是修正后的代码:
func getPromoCodes() async throws -> [PromoCode] { return try await withCheckedThrowingContinuation { continuation in promoCodes.observeSingleEvent(of: .value) { snap in do { guard let snapValue = snap.value as? [String: Any] else { throw NSError(domain: "FirebaseError", code: -1, userInfo: [NSLocalizedDescriptionKey: "快照数据格式不符合预期"]) } let jsonData = try JSONSerialization.data(withJSONObject: snapValue) let decoded = try JSONDecoder().decode([PromoCode].self, from: jsonData) continuation.resume(returning: decoded) } catch { continuation.resume(throwing: error) } } } }
关键细节说明:
withCheckedThrowingContinuation的作用是把回调逻辑转换成Async/Await兼容的异步任务,它会传递一个continuation对象,用来传递最终结果或错误- 解析快照时如果格式不对,直接抛出自定义错误;JSON转换或解码出错时,直接抛出捕获到的原生错误
- 无论成功还是失败,必须调用
continuation.resume,否则异步任务会一直挂起,引发内存泄漏或死锁
内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

