我在项目中定义了一个类来管理我在Firebase中设置的数据库。以下是我到目前为止在课堂上所做的工作。
import Foundation
import Firebase
class db{
class func getPrim() -> [String]{
var ret = [String]()
let ref = FIRDatabase.database().reference()
ref.child("bunya1").observeEventType(FIRDataEventType.Value, withBlock: {
s in
ret = s.value! as! [String]
})
print("ret: \(ret)")
return ret
}
}
该方法在print()
方法中调用,如print(db.getPrim())
。但是控制台(或终端?无论如何,xcode底部的屏幕......)所说的只是一个空数组。我用print("-----------------------")
接受了上述陈述。
-----------------------
ret: []
[]
-----------------------
2016-09-07 20:23:08.808 이모저모[36962:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-09-07 20:23:08.815 이모저모[36962:] <FIRAnalytics/INFO> Firebase Analytics enabled
ret
方法中的.observeEventType()
似乎没有将其值从方法块中删除。据我所知,数据应该保留。任何人都可以给我一个提示吗?我仍然不了解作为方法参数的代码块是如何工作的。日Thnx !!
答案 0 :(得分:3)
根据定义,所有firebase操作都是异步的,这意味着您的程序在转到代码中的下一个语句之前不会等待来自firebase的数据。因此,在调用print语句时,还没有获取来自firebase的数据。
请查看this answer了解详情。
答案 1 :(得分:0)
André(以及Vikrum答案的链接)确实是这种情况发生的原因。但是,如果在代码中添加一些日志语句,通常最容易理解:
class func getPrim() -> [String]{
let ref = FIRDatabase.database().reference()
print("Before observer");
ref.child("bunya1").observeEventType(FIRDataEventType.Value, withBlock: {
s in
print("In observer block");
})
print("After observer");
return "..."
}
运行此代码时,日志记录将按以下顺序进行:
在观察者之前
观察员之后
观察者回调
这可能不是您期望它们出现的顺序。但它肯定解释了为什么你在你的代码片段中返回一个空数组。如果块中的代码尚未运行,则该项尚未添加到阵列中。
这个顺序被颠倒的原因是André和Vikrum说:对Firebase的调用是异步发生的。由于它可能需要一些时间(特别是如果这是您第一次访问数据库),Swift代码将继续执行以确保应用程序保持响应。一旦数据从Firebase返回,您的块就会被调用(因此它有时被称为“回调”)并且您获得了数据。