从 swift 添加数据并查询到 firebase

2024-01-06

我在从 swift 到 firebase 的查询中遇到问题。下面是我在 firebase 中的示例 JSON:

卢利维-d220

Contas

  -KwlPQZTqVfNhHAsFyW5
      Nome: "Assets" 
      Numero: "1"

  -KwlGJLUTqVfnhYHAsFyW5
      Nome: "Liabilities" 
      Numero: "2"

我的代码如下:

    let nome: String = "Liabilities"
    let numero: String = "2"
    ref = Database.database().reference()
    ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in
        let numero = (snapshot.value as? NSDictionary)?["Numero"] as? String
        print (numero as Any)
 }

调试时,调试器只是将(快照)之后的所有代码都跳转进去,并不执行。

我做错了什么?

thanks


tl;dr:要在 XCode 中调试异步代码,请在完成处理程序内的第一个语句上放置一个断点。

更长的解释:

当您从 Firebase 观察值时,可能需要任意时间才能获取该数据。为了防止您的程序在此期间被阻止,当您的代码继续运行时,会在后台从 Firebase 数据库加载数据。然后,当数据可用时,Firebase 会调用您的完成处理程序。

这种模式称为异步加载,几乎所有现代 Web API 都很常见。但这可能非常难以适应。

查看发生情况的一种简单方法是使用一些适当的日志记录语句来运行代码:

ref = Database.database().reference()
print("Before attaching observer")
ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in
    print("Inside completion handler")
}
print("After attaching observer")

此代码将立即打印:

在附加观察者之前

添加观察者后

然后过了一会儿(取决于网络速度和其他因素):

内部完成处理程序

虽然有多种方法可以使块后的代码等待数据(有关更多信息,请参阅下面的一些链接),但处理异步加载的更常见方法是重新构建问题。不要尝试编写“首先获取数据,然后打印它”的代码,而是将您的问题描述为“我们开始获取数据。每当我们获取数据时,我们都会打印它”。

将其建模为代码的方法是将需要访问 Firebase 数据的所有代码移至into观察者的完成处理程序。你的代码已经做到了这一点print (numero as Any)在那里。

要在 XCode 中调试异步代码,请在完成处理程序内的代码上放置一个断点。当数据从 Firebase 返回时,将命中断点。

一些也涉及此行为的问题:

  • Swift:在返回函数之前等待 Firebase 加载 https://stackoverflow.com/questions/41262793/swift-wait-for-firebase-to-load-before-return-a-function
  • 如何让应用程序等待 Firebase 请求完成 https://stackoverflow.com/questions/39190795/how-to-make-app-wait-until-firebase-request-is-finished
  • 使用 Swift 完成 Firebase 中的异步任务 https://stackoverflow.com/questions/37104816/finish-asynchronous-task-in-firebase-with-swift
  • Firebase下载完成后如何直接执行代码? https://stackoverflow.com/questions/41240040/how-to-execute-code-directly-after-firebase-finishes-downloading
  • 有没有办法在 Firebase 中等待查询完成? https://stackoverflow.com/questions/28359465/is-there-a-way-to-wait-for-a-query-to-be-finished-in-firebase
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 swift 添加数据并查询到 firebase 的相关文章

随机推荐