You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中从Firebase Storage获取PDF数据遇到的问题

问题分析与解决方案

核心问题

你的代码存在异步操作与同步返回不匹配的致命问题:getEmailData是同步返回值的函数,但内部调用的firebaseRepository.getData是异步回调操作。函数执行到return语句时,异步回调还没触发,dataAttachment完全没被赋值,此时强行解包dataAttachment!会直接崩溃,更不可能拿到完整的PDF数据。

修正后的代码

@MainActor
func getEmailData() async throws -> EmailData {
    let firebaseRepository = Storage.storage().reference().child(referral.cvStorageReference)
    // 使用Firebase提供的async/await版本getData,等待数据完整加载完成
    let data = try await firebaseRepository.getData(maxSize: 5 * 1024 * 1024)
    let dataAttachment = EmailData.AttachmentData(data: data, mimeType: "application/pdf", fileName: "file.pdf")
    return EmailData(attachments: [dataAttachment])
}

关键改动说明

  • 将函数改为异步抛出函数(async throws):确保只有在Firebase数据完整加载完成后才返回结果,彻底解决时序问题
  • 替换闭包版getData为async/await版本:消除回调异步带来的不确定性,保证获取到完整的Blob数据
  • 移除强制解包:通过try await处理加载过程中的错误(比如网络失败、文件超出大小限制),同时确保data不为nil再创建附件

调用示例

使用该函数时需要配合await并处理错误:

Task {
    do {
        let emailData = try await getEmailData()
        // 处理拿到的完整EmailData
    } catch {
        // 处理加载失败的情况
        print("PDF加载失败:\(error.localizedDescription)")
    }
}

内容的提问来源于stack exchange,提问作者M4tta3us

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:50:21