【发布时间】:2016-04-21 17:14:41
【问题描述】:
在我的 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
}
【问题讨论】:
-
observeSingleEventOfType是异步操作吗?我想是……那是你的问题。 -
老实说,我知道这意味着什么,但是如果它是异步操作,我该如何解决?
-
就像 Eric D 说的:
observeSingleEventOfType是一个块,似乎是异步的。因此,在您的块完成之前,您会返回。这就是为什么你总是打印 0 -
我试图在它完成之前返回它,但该块是一个 void 函数,所以它不能返回任何东西:/
-
丹尼尔斯的回答会起作用,但我认为你的代码可能过于复杂。请问订单号是做什么用的,什么时候需要?我问的是当您的应用程序启动时,您可以观察订单号以获得初始值。然后,每当它被任何客户端更新时,您的应用程序都会自动收到更改通知;而不是轮询它,订单号将始终准确。此外,您可能希望根据 childCount 更改您的订单号,因为有更好的解决方案 - 一旦我们有更多信息,可以在答案中解决。