使用 Firebase 编写异步代码

2023-12-29

我正在尝试创建一个算法,该算法创建 12 个结构对象(问题)并将它们放入一个数组(问题)中。但是,它似乎不起作用,因为对象是在 Firebase 中的数据能够修改它们之前创建的。我试图使它们异步,但我在网上发现没有任何效果。提前致谢。

let databaseRef = FIRDatabase.database().reference()
    databaseRef.child("NumberOfQuestions").observeSingleEvent(of: .value, with: { snapshot in
    while self.questions.count < 12{
    var question = questionMGR() //questionMGR is the name of my struct
    let questionNumber = String(Int(arc4random_uniform(snapshot.value as! UInt32) + 1))

    databaseRef.child("questions").child("questionNumber: " + questionNum).child("title").observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot.value ?? "")
        question.title = (snapshot.value as? String)!

        databaseRef.child("questions").child("questionNumber: " + questionNum).child("description").observeSingleEvent(of: .value, with: { snapshot in
            print(snapshot.value ?? "")
            question.desc = (snapshot.value as? String)!
        })
    })
        self.questions.append(question)
   }
 })

发生这种情况时,解决方案通常是移动操作inside回调:

databaseRef.child("questions").child("questionNumber: " + questionNum).child("title").observeSingleEvent(of: .value, with: { snapshot in
    print(snapshot.value ?? "")
    question.title = (snapshot.value as? String)!

    databaseRef.child("questions").childSnapshot(forPath: "questionNumber: " + questionNum).childSnapshot(forPath: "description").observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot.value ?? "")
        question.desc = (snapshot.value as? String)!
        self.questions.append(question)
    })
})

但在这种情况下,我想知道为什么你不简单地一次性加载整个问题:

FIRDatabaseReference qref = databaseRef.child("questions").child("questionNumber: " + questionNum)
qref.observeSingleEvent(of: .value, with: { snapshot in
    var question = questionMGR()
    question.title = (snapshot.childSnapshot(forPath: "title").value as? String)!
    question.desc = (snapshot.childSnapshot(forPath: "description").value as? String)!
    self.questions.append(question)
})

我考虑两次单独调用标题和描述的唯一原因是,如果您的问题包含更多您不需要的数据。但如果是这种情况,我会重新构建您的 JSON,将标题和描述分离到一个单独的顶级列表中。

在 NoSQL 中,将数据建模为与屏幕上显示的内容非常相似通常是一件好事 (tm)。因此,如果您有每个问题的标题和描述的列表,您应该考虑精确存储:每个问题的标题和描述的列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Firebase 编写异步代码 的相关文章

随机推荐

  • 如何以编程方式关闭 Android 手机?

    是否可以通过编程方式关闭移动设备 那是不使用 su 命令 这是可能的 但你需要一个RootedAndroid 设备Superuser使用权 除非您的应用程序已使用 Root 签名 否则您无法在没有 Root 的情况下执行此操作System
  • 模板专业化是否扩展或覆盖通用模板?

    template
  • 让 Android 应用程序监听共享链接

    当用户共享来自其他应用程序 如浏览器 的 URL 时 我希望我的 Android 应用程序显示为选项 我如何注册我的应用程序来做到这一点 我该如何对链接共享做出反应 多谢 Edit 我尝试过像这样使用 IntentFilter 但没有成功
  • 如何使用audio_service和just_audio在Flutter中查找当前歌曲时长

    当您设置MediaItem in 音频服务 https pub dev packages audio service你还不知道歌曲时长 因为只是音频 https pub dev packages just audio目前还没有任何更改可以告
  • jQuery 与 ExtJS 兼容吗?

    我相信 Ext js 使用了 jQuery 但我不确定 有谁知道是否与 jQuery 和 Ext js 完全兼容 Ext js 完全独立于 jQuery 因此不以任何方式依赖 jQuery 不知道 完全兼容性 是什么意思 但您可以在同一页面
  • Xcode UI 测试允许系统警报系列

    我有问题 如果我尝试允许系列系统警报 只工作一次 而下一个警报不 允许 我在谷歌上搜索了更多时间 并且知道了那个帖子 Xcode 7 UI 测试 如何在代码中消除一系列系统警报 https stackoverflow com questio
  • 我们可以在同一个 EAR 中跨 Web 应用程序共享 CDI @ApplicationScoped bean 实例吗?

    我有一个 JavaEE 应用程序 它有 2 个 Web 应用程序 我还有另一个库 Web 模块 其中包含 common bean 注释为 ApplicationScoped 我的问题是 我可以在两个 Web 应用程序之间共享 common
  • 浏览器如何判断是下载还是显示

    我有一个 Web 资源 它返回 json 内容Content Type application json 通常内容会直接显示在浏览器中 但有时不会 而是显示下载提示 我知道有一个标题Content Disposition inline at
  • jQuery:如何在单击缩略图时显示图像弹出窗口?

    在我的 aspx 页面中 我有一个缩略图 img 当用户单击该图像时 我希望显示一个弹出窗口 用较大 完整 版本的图像遮挡 UI 的其余部分 有没有任何插件可以做到这一点 有很多 jQuery 插件可用于此 Thickbox http co
  • Google Play 商店是否支持华为 HMS?

    我有一个带有常见谷歌广告和应用内支付功能的应用程序 它已被 Play 商店接受 现在我想让它同时支持GMS和HMS 根据适当服务的可用性 应用程序可以决定使用哪个平台 该应用程序内置了华为功能 在我自己的设备上测试时运行良好 然而 一旦华为
  • @Inject 通过 URL 将参数传递给 CDI @Named bean

    如果我无法将 ManagedProperty 注释与 Named 一起使用 因为 ManagedProperty 在 CDI 中不起作用 那么如何将 URL 中的参数传递给 Facelets 客户端 在我的代码中 我想通过 后退 和 前进
  • 使用 React.JS 导入 SVG 的最佳方法是什么

    我和我的团队正在构建一个 React 应用程序 我们希望导入 SVG 而不是作为字符串 这样我们就能够将其用作组件 由于我们使用 CRA 安装了该项目 因此 SVGR 已安装并处于 webpack 配置中 我们想知道是否有其他方法可以导入
  • utf-8 邮件 php 希腊字符

    我在我的网站中创建一个表单 我希望客户能够编写和发送希腊字符 但在邮件中我收到类似这样的内容 而不是希腊字符 我尝试使用以下代码将编码更改为 UTF 8 mail recipient subject UTF 8 B base64 encod
  • 有没有办法排除 docusaurus 中 docs 目录中的路径?

    我想从其中排除子文件夹docs 生成文档页面的目录 customDocsPath https docusaurus io docs en site config customdocspath string是一个相关选项 但它是一个字符串 是
  • Three.js - 相机的良好 z 距离,可实现盒子的全视图

    我使用 Three js 显示尺寸为 700x700 的场景 在此场景中 我生成了一个随机位置在 250 到 250 之间 对于 x y z 的粒子系统 因此盒子的大小为 500x500 为了计算相机的正确距离 为了适应盒子的完整视图 我尝
  • 如何在 EditItemTemplate 字段中绑定 GridView 中的 DropDownList?

    这是我在运行时绑定的 gridview 中的代码
  • 我应该如何在 Visual Studio 中使用调试/发布模式?

    我通常在工作机器上本地测试代码 然后将其移至开发环境 最后移至生产环境 对于这种情况 使用调试 发布模式的最佳方法是什么 我只需要关心我的机器中的调试模式吗 我应该将调试模式还是发布模式发布到开发中 我知道我可能应该使用发布模式发布到生产环
  • Django Rest Framework - 当用户不是对象所有者时拒绝用户推送

    目前 我设置了权限 如果用户不是对象所有者 则可以阻止他们进行 GET DELETE 和 PUT 操作Stock 但由于某种原因 当用户执行 PUSH 时 权限不起作用 即任何用户都可以 PUSHNote to a Stock即使他们不是S
  • 在 Docker 中运行 Angular2 应用程序

    我正在尝试在 docker 中运行我的 ng2 应用程序 我有 Docker 文件 FROM ubuntu latest RUN apt get update Install curl git RUN apt get qq y instal
  • 使用 Firebase 编写异步代码

    我正在尝试创建一个算法 该算法创建 12 个结构对象 问题 并将它们放入一个数组 问题 中 但是 它似乎不起作用 因为对象是在 Firebase 中的数据能够修改它们之前创建的 我试图使它们异步 但我在网上发现没有任何效果 提前致谢 let