从Firebase数据库读取数据的问题

时间:2017-06-23 00:52:01

标签: ios arrays swift firebase firebase-realtime-database

好的我正在从数据库中读取数据,当我打印各个变量时,它们会正确打印出来。但是,似乎数据拒绝附加到数组。谁知道为什么?我根本无法解决这个问题。

let commuteBuilder = Commutes()

    Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in


        //print(snapshot)

        if let dict = snapshot.value as? NSDictionary {
            commuteBuilder.distance = dict["Distance"] as! Double
            commuteBuilder.title = dict["TripName"] as! String
            commuteBuilder.transportType = (dict["Transport"] as? String)!

        }

        commuteArray.append(commuteBuilder)
    })
    print("helper")
    print(commuteArray.count)
    return commuteArray

1 个答案:

答案 0 :(得分:1)

数据 正确添加到数组中,而不是在您打印数组内容时。

如果你改变这样的代码,你可以看到:

let commuteBuilder = Commutes()

Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in

    if let dict = snapshot.value as? NSDictionary {
        commuteBuilder.distance = dict["Distance"] as! Double
        commuteBuilder.title = dict["TripName"] as! String
        commuteBuilder.transportType = (dict["Transport"] as? String)!

    }

    commuteArray.append(commuteBuilder)
    print("added one, now have \(commuteArray.count)")
})
print("returning \(commuteArray.count)")
return commuteArray

你会看到它打印出这样的东西:

  

返回0

     

添加一个,现在有1个

     

添加一个,现在有2个

这可能不是您预期的输出。但它按预期工作。 Firebase异步加载其数据库中的数据。它不是阻止你的代码,而是让线程继续(这样用户可以继续使用应用程序),而是在新数据可用时回调你传递给observe的代码块。

这意味着,当此代码返回数组时,它仍然为空,但稍后会在项目进入时添加项目。这意味着您无法以您尝试的方式返回函数中的数据。

我发现改变我对代码的思考方式最容易。而不是"首先获取数据,然后将其打印出来#34;,我将其框架为"开始获取数据。当数据返回时,打印它"。

在上面的代码中,我通过将打印计数的代码移动到回调块来完成此操作。您也可以创建自己的回调,而不是在Swift中创建自己的回调,称为完成处理程序闭包。您可以在this articlethis article,此问题Callback function syntax in Swift或Apple的文档中找到示例。