在我的viewDidLoad()中打印出函数的结果
override func viewDidLoad() {
super.viewDidLoad()
print("top count = \(getCurrentOrderNum())")
}
该函数计算类似的值
func getCurrentOrderNum() -> Int{
var orderNum = 0
ref = Firebase(url: "urlhiddenforprivacy")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let count = snapshot.childrenCount
orderNum = Int(count)
})
return orderNum
}
然而它还打印0?我试图将var orderNum:Int = Int()放在我的代码顶部,而不是放在我的getCurrentOrderNum函数中,但是这不起作用。我知道它在我的ref.observe函数中得到了正确的值,因为当我运行它时...它打印出正确的值
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let count = snapshot.childrenCount
orderNum = Int(count)
print(orderNum) //*****THIS PRINTS THE RIGHT VALUE****
})
return orderNum
}
答案 0 :(得分:6)
在异步块实际运行之前,您将从方法orderNum
返回getCurrentOrderNum()
。因此,在返回时,orderNum
仍为0
,即您设置的初始值。该块稍后完成。
您最好的选择可能是将方法更改为:
func getCurrentOrderNum(callback:Int->()) {
var orderNum = 0
ref = Firebase(url: "urlhiddenforprivacy")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let count = snapshot.childrenCount
orderNum = Int(count)
callback(orderNum)
})
}
然后你会这样称呼它:
override func viewDidLoad() {
super.viewDidLoad()
getCurrentOrderNum { orderNum in print(orderNum) }
}
这会更改getCurrentOrderNum()
方法,以便在检索到正确的值后回调到闭包。
更新:根据以下评论,目标是做以下事情:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int)->Int {
return getCurrentOrderNum()
}
这是一种异步方法:
class YourViewController : UIViewController, UITableViewDataSource {
private var orderNumber:Int = 0
private IBOutlet var tableView:UITableView!
func getCurrentOrderNum(callback:Int->()) {
ref = Firebase(url: "urlhiddenforprivacy")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let count = snapshot.childrenCount
callback(Int(count))
})
}
override func viewDidLoad() {
super.viewDidLoad()
getCurrentOrderNum {
orderNum in
//This code runs after Firebase returns the value over the network
self.orderNumber = orderNum // Set our orderNumber to what came back from the request for current order number
self.tableView.reloadData() // Now reload the tableView so it updates with the correct number of rows
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.orderNumber // When the view first loads, this will be 0 and the table will show nothing. After the request to Firebase returns the value, this will be set to the right number, the table view will be reloaded, and it will call this method again to get the updated number of rows to display.
}
}
答案 1 :(得分:0)
通常使用Firebase返回函数结果可能很棘手 - 它采用异步过程并将其压缩到同步过程中。虽然可以做到(如Daniels的好答案所示),但还有其他选择。通过查看问题中的代码,可能会忽略一些可能被忽略的重要Firebase概念。
我想提供一个利用Firebase强大功能的超级简单异步解决方案。
这是一些概念性的东西:
定义var以跟踪订单号 -
var currentOrderNumber = Int
Firebase结构
orders
order_id_00
order_num: 12345
order_id_01
order_num: 12346
在viewDidLoad中的orders节点上设置观察者,以便在添加新订单时通知应用。每当订单写入节点时都会发生这种情况,因此所有客户都知道当前的订单号是什么:
ref.queryOnOrdersNode.childAdded { snapshot in
if let orderNumber = snapshot.value["order_num"] as? Int {
currentOrderNumber = orderNumber
}
}
从那时起打印currentOrderNumber时,它将包含实际的currentOrderNumber。
你让Firebase完成繁重的工作真是太酷了。而不是一遍又一遍地轮询Firebase以获取currentOrderNumbers,Firebase会告诉您的应用当前订单号在更改时的状态。
您可以对此进行扩展以填充tableView并通过添加更新它。
firebase结构
people
person_id_0
name: "Bill"
person_id_1
name: "Larry"
以及填充数组并添加观察者以供将来添加的代码:
var namesArray = [String]
peopleNode.observeEventType(.ChildAdded) { snapshot in
if let name = child.value["name"] as? String {
namesArray.append(name)
self.tableView.reloadData
}
}
和tableView委托方法
func tableView(tableView: UITableView, numberOfRowsInSection section: Int)->Int {
return peopleArray.count
}
同样,这让Firebase可以完成繁重的工作;您不必在将新人添加到人员节点时轮询数据,Firebase会告诉您的应用并且tableView会自动更新。
您会注意到代码超短且紧张,因为您让Firebase完成了大部分工作,以便更新变量并使用新数据填充表格。
(此代码中存在拼写错误,因为它是概念性的)