如何快速将云Firestore中的数据保存到变量中?

2024-06-26

我想将文档中的特定字段保存到变量中。到目前为止我的代码:

func getDocument(path: String, field: String? = "nil") -> some Any{
    var returnVar : Any = "DEFAULT VAL"
    var db: Firestore!
    db = Firestore.firestore()
    
    let docRef = db.document(path)
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            if(field != "nil"){
                let property =  document.get("phrase") ?? "nil"
                returnVar = property
                return;
            }
            else{
                let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
                returnVar = dataDescription
                return;
            }
        } else {
            print("Document does not exist")
            returnVar = -1
            return;
        }
    }
    print("Returned val: " + (returnVar as! String))
    return returnVar;
}

然而,似乎我的 getDocument 方法在从 firebase 读取数据之前返回(来自纯 OOP 领域,我不知道这是如何发生的)从调试来看,执行似乎只是跳过整个 docRef.getDocument 代码并跳转到返回声明。只有在函数返回后,docRef.getDocument块中的代码才会被执行(什么?已经返回的函数中的代码如何继续执行?)。

如何将特定字段存储在变量中并返回它?


那是因为 Firestore 功能getDocument is an asynchronous函数会立即返回,然后继续执行其中的代码。如果你想从这里返回一个特定的值,你需要使用completion Handler。你的函数可能看起来像这样。

func getDocument(path: String, field: String? = "nil", completion:@escaping(Any)->()) {
var returnVar : Any = "DEFAULT VAL"
var db: Firestore!
db = Firestore.firestore()

let docRef = db.document(path)
docRef.getDocument { (document, error) in
    if let document = document, document.exists {
        if(field != "nil"){
            let property =  document.get("phrase") ?? "nil"
            returnVar = property
            completion(returnVar)
        }
        else{
            let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
            returnVar = dataDescription
            completion(returnVar)
        }
    } else {
        print("Document does not exist")
        returnVar = -1
        completion(returnVar)
      }
    }
  }

然后调用该函数viewDidLoad或任何其他类似的功能。

getDocument(path: path, field: field){(value) in
    print(value)
}

您可以查看更多有关Completion Handlers here https://vasundharavision.com/blog/ios/completion-handler-in-swift

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

如何快速将云Firestore中的数据保存到变量中? 的相关文章

随机推荐

  • 图片框图像缩放

    我在 C 中遇到图像缩放问题 我有一个给定尺寸的图片框 例如宽度 800 像素 高度 600 像素 我正在将不同的图像加载到该图片框中 小图像 400x400 和大图像 800 x 600 如果我的图像不适合盒子 它们就会被调整大小 但他们
  • 无法部署到 docker - 加密失败并且找不到 Rust 编译器

    我正在尝试在 docker 上部署新版本 但遇到了以前从未见过的错误 我按照步骤安装加密并升级 pip 但这不起作用 如果有人知道如何解决此问题 请告诉我 谢谢你 error Can not find Rust compiler Comma
  • 可以使用 Java 库将轻量级文本标记语言转换为 HTML 和 LaTeX? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 一种简单的轻量级标记语言 例如被定义为西奥尔1 0 http wikicreole org wiki Home对于在程序和应用程序文档中使
  • 如何设置验证消息的顺序?

    我们使用 错误消息 XPage 本机 控件向用户显示验证错误 有用 通过根据需要设置字段并输入字段错误消息来完成验证 没什么特别的 现在的要求是将错误消息设置为与表单中出现的顺序相同的顺序 这可能吗 我想我可以创建一个自定义验证器 Java
  • 如何根据单元格中输入的文本内容增加jtable中行的高度

    我有一个可编辑的jtable 当用户用文本写入单元格时 如果输入的文本更适合单元格的大小 则表格中的行的高度必须增加以适应用户输入的新文本 您能告诉我如何根据输入的文本行增加行的高度吗 有人能帮我吗 我尝试将 JTextArea 添加到一行
  • 我在不使用互联网或 GPS 的情况下获得电话间隙地理定位中的(纬度、经度)坐标?

    当我在电话间隙地理定位中尝试示例程序时 我在没有互联网或 GPS 的情况下在我的三星 Pop 中获取当前位置的纬度和经度 我不知道当我的设备中的 wifi 和 gps 被禁用时 它如何获取当前位置的坐标 海拔高度和时间戳 请帮助我
  • Google Places 在 extjs4 中自动完成

    我在服务器端使用 extjs4 和 Spring 我需要将 Google Places 自动完成功能集成到 extjs4 表单之一中 有什么办法可以做到这一点吗 我不确定我们是否可以将 Google 自动完成与 extjs 集成 我已经搜索
  • RegistrationsController#create 中的 ActionController::InvalidAuthenticityToken

    您好 我正在使用 Devise 进行用户身份验证 突然我的新用户注册无法正常工作 这是我收到的错误 ActionController InvalidAuthenticityToken Rails root home example app
  • 为什么 PHP 变量以 $ 符号开头?

    有没有人思考过这个问题 为什么我们必须写 var name value 并不是var name value 是的 我知道这是 PHP 使用的语法规则 但为什么它是 标志符号 因为 PHP 是基于 Perl 的 Perl 使用 虽然 Perl
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • Python数学域错误[重复]

    这个问题在这里已经有答案了 我正在编写一个程序来求解二次方程并打印根 在进入主程序之前 我只是想求平方根 我收到的错误是 数学域错误 如果有人能给我一些帮助来解释为什么它不起作用 那就太好了 import math a int sys ar
  • 为什么我在这里得到一个空的注释数组

    根据doc http download oracle com javase 6 docs api java lang reflect Method html getDeclaredAnnotations 28 29并对此answer htt
  • Android ListView,启动新活动

    嘿有人可以告诉我如何通过按列表视图中的项目来启动活动吗 我有一个预感 EDIT 我想我已经修复了它 因为我没有收到错误消息 但是当我开始此活动 视频 时 应用程序崩溃并想要强制关闭 问题是什么 请帮忙 D 这是源代码 com alpha l
  • 有人可以解释一下以下内存分配 C 程序的性能行为吗?

    在我的机器上 时间 A 和时间 B 交换取决于是否A是 定义或未定义 这会改变两个的顺序 callocs 被称为 我最初将此归因于寻呼系统 奇怪的是 当mmap被用来代替calloc 情况更加奇怪 两个循环花费的时间相同 正如预期的那样 作
  • InnoDB vs. MyISAM 插入查询时间

    我有一个大型 MySQL 表 约 1000 万行 6 5G 用于读取和写入 它是MyISAM 由于MyISAM 的所有表写入锁 我获得了很多锁 我决定尝试迁移到 InnoDB 推荐用于读 写表 它只锁定写入时的特定行 转换后 我测试了插入语
  • Swift上传文件到PHP服务器

    因此 我将文件从 swift 上传到 PHP 服务器 POST 请求按预期到达 带有标头和所有内容 但我无法从中获取任何内容 FILES 它只是一个空数组 我显然在 Swift 方面做错了什么 这是我的代码 func testUpload
  • CMake的execute_process和任意shell脚本

    CMake s execute processcommand 似乎只让你执行一个进程 而不是你可以输入命令 shell 的任意行 问题是 我想使用管道 文件描述符重定向等 但这似乎不可能 另一种选择对我来说会非常痛苦 我认为 我应该怎么办
  • 导出的 DLL 函数未按词法排序?

    嗯 今天我遇到了一个奇怪的事情 我不久前编写了自己的 GetProcAddress 版本 用于从远程进程获取函数地址 显然我花了很多时间阅读 PE 架构来找出解决这个问题的最佳方法 根据 PECOFF v8 规范 我认为这是最新的官方规范
  • 无法为非报亭应用程序提交具有自动续订订阅的应用程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在提交带有自动更新订阅的非报亭应用程序时从未遇到过问题 但当我尝试提交应用程序进行审核时 我刚刚开始看到此错误 免费和自动续订的应用内购
  • 如何快速将云Firestore中的数据保存到变量中?

    我想将文档中的特定字段保存到变量中 到目前为止我的代码 func getDocument path String field String nil gt some Any var returnVar Any DEFAULT VAL var