2017-06-23 72 views
0

好吧我从数据库中读取数据,并在打印出各个变量时正确输出。但是,好像数据拒绝追加到数组。有人知道为什么我根本弄不清楚。从Firebase数据库中读取数据的问题

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

数据正确添加到阵列中,只是没有在您打印数组的内容的时间。

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

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的代码块。

这意味着当这段代码返回数组时它仍然是空的,但它后来添加了项目。这意味着您不能以您尝试的方式从函数返回数据。

我觉得最容易改变我对代码的思考方式。而不是“首先获取数据,然后打印”,我将其设置为“开始获取数据,当数据返回时,将其打印出来”。

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

+0

好吧,这对我来说更有意义,我明白为什么这可能会有用。我的问题是我以前设置我的代码来使用CoreData,在这种情况下,我正在调用旧数据并将其转储到具有此功能的数组中。那么现在我想为此使用firebase。我得到了如何使用它来填充说自动更新的表视图,但我也有用例,我想添加值(距离值)并输出总距离。 id知道要做的唯一方法是将其转储到数组中并执行求和功能。似乎我不能轻松地使用它们的异步类型函数。 –

+0

你只需要做不同的事情。当你听'.child *'事件时,你可以保持一个正在运行的聚合:只是迄今为止的值的总和。或者,您可以查看'.value'事件,这会一次性为您提供所有子节点。只需迭代它们,并在每次更改时计算总和。请参阅https://firebase.google.com/docs/database/ios/lists-of-data#listen_for_value_events –