【问题标题】:adding data and querying from swift to firebase从 swift 添加数据和查询到 firebase
【发布时间】:2017-10-21 13:37:54
【问题描述】:

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

Lulibvi-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)
 }

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

我做错了什么?

谢谢

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    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 移到观察者的完成处理程序中。您的代码已经通过在其中添加 print (numero as Any) 来做到这一点。

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

    也处理这种行为的几个问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 2019-07-31
      • 2017-09-20
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2017-05-29
      • 2018-03-05
      相关资源
      最近更新 更多