我有一个服务类来从我的Firebase中获取数据:
class Service {
var myName = String?
var myDev: String?
func getData() {
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Data").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let name = value?["name"] as? String ?? ""
self.myName = name
let dev = value?["dev"] as? String ?? ""
self.myDev = dev
}) { (error) in
print(error.localizedDescription)
}
}
}
在我的主课堂中实现:
var service = Service()
override func viewDidLoad(){
super.viewDidLoad()
service.getData()
configureLabel()
}
private func configureLabel(){
self.titleLabel.text = service.myName
self.devLabel.text = service.myDev
}
问题是:只有在我的标签获得myName和myDev.Thus的值后才会获取Firebase中的数据,此值为nil。
答案 0 :(得分:1)
这不是最好的解决方案,但它可以解决您的问题。
struct MyStructure {
var name = ""
var dev = ""
init(with dictionary: [String: String]) {
if let name = dictionary["name"] {
self.name = name
}
if let dev = dictionary["dev"] {
self.dev = dev
}
}
}
class Service {
let databaseRef = FIRDatabase.database().reference()
func getData(completion: @escaping ((_ structure: MyStructure) -> Void)) {
databaseRef.child("Data").observeSingleEvent(of: .value, with: { snapshot in
if let value = snapshot.value as? [String: String] {
completion(MyStructure(with: value))
}
}) { (error) in
print(error.localizedDescription)
}
}
}
let service = Service()
override func viewDidLoad() {
super.viewDidLoad()
service.getData { myStructure in
DispatchQueue.main.async {
self.titleLabel.text = myStructure.name
self.devLabel.text = myStructure.dev
}
}
}
答案 1 :(得分:0)
当然可以。 getData()方法对Firebase服务进行异步调用。这意味着,firebase的 .observeSingleEvent 方法在异步队列中运行,就像进行服务调用的大多数代码块一样。因此编译器到达getData()行,将块推送到另一个队列并继续编译原始队列中的下一行。如果您希望在收到响应后运行这些行,则可以将getData()方法的闭包作为参数添加。
您可以这样做:
getData(completion: () -> Void) {
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("Data").observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let name = value?["name"] as? String ?? ""
self.myName = name
let dev = value?["dev"] as? String ?? ""
self.myDev = dev
completion()
}) { (error) in
print(error.localizedDescription)
}
}
override func viewDidLoad(){
super.viewDidLoad()
service.getData(completion: { Void in
configureLabel()
})
}