在函数外获取 let 值
Getting a let value outside a function
你好,我是 swift 编程新手,我想从 loadData()
获取 label
值,用于我在 [=13] 上的数据库路径(参考) =].我的意思是?!我读取了 "Dio Con Dio" 节点上的数据。发生这种情况是因为值 place
是 let place = "Dio Con Dio"
。因此,我的应用程序不会从 "Paradosiako - Panorama" 节点加载数据。我想从数据库加载所有内容,我想如果我可以使 place
值更改为下一个节点,它就可以读取所有数据。
import UIKit
import FirebaseDatabase
class PlacesTableViewController: UITableViewController {
//MARK: Properties
@IBOutlet weak var placesTableView: UITableView!
//database reference
var dbRef:FIRDatabaseReference?
var places = [Places]()
private var loadedLabels = [String: String]()
private var loadedRatings = [String: Int]()
//handler
var handle:FIRDatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
dbRef = FIRDatabase.database().reference()
// Loads data to cell.
loadData()
}
private func loadData() {
let place = "Dio Con Dio"
dbRef!.child(place+"/placeLabel").observe(.childAdded, with: {
(snapshot) in
let label = snapshot.value as! String
self.updatePlace(snapshot.key, label: label)
})
dbRef!.child(place+"/rating").observe(.childAdded, with: {
(snapshot) in
let rating = snapshot.value as! Int
self.updatePlace(snapshot.key, rating: rating)
})
}
private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) {
if let label = label {
loadedLabels[key] = label
}
if let rating = rating {
loadedRatings[key] = rating
}
guard let label = loadedLabels[key], let rating = loadedRatings[key] else {
return
}
if let place = Places(name: label, rating: rating) {
places.append(place)
placesTableView.reloadData()
}
}
}
(此问题是跟进 。)
对于您的 新 数据库模式,试试这个:
private func loadData() {
dbRef!.observe(.childAdded) {
(placeSnapshot) in
print("Adding place \(placeSnapshot.key)...")
// Load each label on the "placeLabel" list.
let labels = placeSnapshot.childSnapshot(forPath: "placeLabel")
for (key, label) in labels.value as! [String: String] {
self.updatePlace(key, label: label)
}
// Load each rating in the "rating" list.
let ratings = placeSnapshot.childSnapshot(forPath: "rating")
for (key, rating) in ratings.value as! [String: Int] {
self.updatePlace(key, rating: rating)
}
}
}
updatePlace
函数只是 groups 由 loadData
单独加载的给定地点的标签和评级属性。
地点移除。当然,上面的代码不会处理位置移除。为此,您还需要监听 childRemoved
事件。
很难在评论中解释这一点,所以我会在这里解决你当前的问题,但我相信 Paulo 回答了你的问题。您甚至可以就此问题提出一个新问题。
这是您遇到问题的代码:
for (key, rating) in ratings.value as! [String: Int] {
self.updatePlace(key, rating: rating)
}
这段代码没有任何问题,只要ratings.value填入字符串:整数对即可。您的错误发生是因为不知何故缺少一把钥匙。 (运行时发现一个NSNull,所以无法将数据转换成字典)
您需要在构造数组的位置设置断点:
placeSnapshot.childSnapshot(forPath: "rating")
(称为评分 here/locally)。如果可以忽略没有键的条目,则跳过它们并且不要将它们附加到您的数组。但更有可能是你出错了,需要找出为什么要添加空值...
这样更有意义吗?如果 Paulo 解决了问题,请接受他的回答,并打开一个新问题,提供有关 childSnapshot(代码)的更多信息,一定会有人帮助您。 (我知道我会努力的。)
你好,我是 swift 编程新手,我想从 loadData()
获取 label
值,用于我在 [=13] 上的数据库路径(参考) =].我的意思是?!我读取了 "Dio Con Dio" 节点上的数据。发生这种情况是因为值 place
是 let place = "Dio Con Dio"
。因此,我的应用程序不会从 "Paradosiako - Panorama" 节点加载数据。我想从数据库加载所有内容,我想如果我可以使 place
值更改为下一个节点,它就可以读取所有数据。
import UIKit
import FirebaseDatabase
class PlacesTableViewController: UITableViewController {
//MARK: Properties
@IBOutlet weak var placesTableView: UITableView!
//database reference
var dbRef:FIRDatabaseReference?
var places = [Places]()
private var loadedLabels = [String: String]()
private var loadedRatings = [String: Int]()
//handler
var handle:FIRDatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
dbRef = FIRDatabase.database().reference()
// Loads data to cell.
loadData()
}
private func loadData() {
let place = "Dio Con Dio"
dbRef!.child(place+"/placeLabel").observe(.childAdded, with: {
(snapshot) in
let label = snapshot.value as! String
self.updatePlace(snapshot.key, label: label)
})
dbRef!.child(place+"/rating").observe(.childAdded, with: {
(snapshot) in
let rating = snapshot.value as! Int
self.updatePlace(snapshot.key, rating: rating)
})
}
private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) {
if let label = label {
loadedLabels[key] = label
}
if let rating = rating {
loadedRatings[key] = rating
}
guard let label = loadedLabels[key], let rating = loadedRatings[key] else {
return
}
if let place = Places(name: label, rating: rating) {
places.append(place)
placesTableView.reloadData()
}
}
}
(此问题是跟进
对于您的 新 数据库模式,试试这个:
private func loadData() {
dbRef!.observe(.childAdded) {
(placeSnapshot) in
print("Adding place \(placeSnapshot.key)...")
// Load each label on the "placeLabel" list.
let labels = placeSnapshot.childSnapshot(forPath: "placeLabel")
for (key, label) in labels.value as! [String: String] {
self.updatePlace(key, label: label)
}
// Load each rating in the "rating" list.
let ratings = placeSnapshot.childSnapshot(forPath: "rating")
for (key, rating) in ratings.value as! [String: Int] {
self.updatePlace(key, rating: rating)
}
}
}
updatePlace
函数只是 groups 由 loadData
单独加载的给定地点的标签和评级属性。
地点移除。当然,上面的代码不会处理位置移除。为此,您还需要监听 childRemoved
事件。
很难在评论中解释这一点,所以我会在这里解决你当前的问题,但我相信 Paulo 回答了你的问题。您甚至可以就此问题提出一个新问题。
这是您遇到问题的代码:
for (key, rating) in ratings.value as! [String: Int] {
self.updatePlace(key, rating: rating)
}
这段代码没有任何问题,只要ratings.value填入字符串:整数对即可。您的错误发生是因为不知何故缺少一把钥匙。 (运行时发现一个NSNull,所以无法将数据转换成字典)
您需要在构造数组的位置设置断点:
placeSnapshot.childSnapshot(forPath: "rating")
(称为评分 here/locally)。如果可以忽略没有键的条目,则跳过它们并且不要将它们附加到您的数组。但更有可能是你出错了,需要找出为什么要添加空值...
这样更有意义吗?如果 Paulo 解决了问题,请接受他的回答,并打开一个新问题,提供有关 childSnapshot(代码)的更多信息,一定会有人帮助您。 (我知道我会努力的。)