- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在开发一款 Wine 搜索器应用程序。基本上,我用食物搭配来搭配 Wine 。用户选择他最喜欢的食物。我有我的 firebase 数据库存储标有该特定 Wine 的名称和类型的 Wine 数据。这是我在 firebase 中的 json 结构。
Wines:
Wine1:
Name: Catena Zapata Malbec
Type: Bold Red
Wine2:
.......... etc.
我有另一个以前的 View Controller 用于选择最喜欢的食物。例如,如果用户选择红肉,则相关的打字将是“Bold Red”。所以,我做了一个 switch case,对于 case:1(选择的是红肉),引用进入“Type”并搜索“Bold Red”,最后打印出该红酒的所有相关结果。
class Wine: NSObject{
var name: String?
var type: String?
var foodChoice: String?
}
class ResultViewController: UITableViewController {
var ref: FIRDatabaseReference!
var refHandle: UInt!
var wineList = [Wine]()
var intPassed: Int!
let cellId = "cellId"
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Results"
ref = FIRDatabase.database().reference()
fetchWine()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return wineList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId)
cell.textLabel?.text = wineList[indexPath.row].name
return cell
}
func fetchWine(){
switch intPassed {
case 0:
refHandle = ref.child("Wines").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let wine = Wine()
wine.name = dictionary["name"] as! String?
wine.type = dictionary["type"] as! String?
wine.setValuesForKeys(dictionary)
self.wineList.append(wine)
print (wine.name, wine.type)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
})
case 1:
refHandle = ref.queryOrdered(byChild: "Type").queryEqual(toValue: "Bold Red").observe(.value, with: {(snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let wine = Wine()
wine.name = dictionary["name"] as! String?
wine.setValuesForKeys(dictionary)
self.wineList.append(wine)
print (wine.name)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
})
default:
print("nothing")
}
}
}
我可以打印案例 0 的数据。但是如果我想将所选类型的答案与数据库中的类型进行比较,我将无法获得所需的数据。是 refHandle 的引用错误吗?
这是案例 0 的打印结果。我只是为了确保 firebase 正常工作。其他选项只是我数据库中的其他 Wine 。
0
Optional("Catena Zapata Malbec") Optional("Bold Red")
Optional("Merlot") Optional("Medium Red")
Optional("Pinot Noir") Optional("Light Red")
求助!非常感谢!!
最佳答案
我观察到的是您的 refHandle
似乎是正确的。但是您在观察 block 中访问了错误的数据。
你的 dictionary
在 case 1 中看起来像这样:
["Wine1": {
name = "Catena Zapata Malbec";
type = "Bold Red";
}]
这意味着,在案例 1 中,您需要访问另一个字典才能仅访问 Wine 的名称 Catena Zapata Malbec
case 1:
refHandle = ref.queryOrdered(byChild: "Type").queryEqual(toValue: "Bold Red").observe(.value, with: {(snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
// Here access your name of the wine in the node
if let wine1Dictionary = dictionary["Wine1"] as? [String: AnyObject] {
let wine = Wine()
wine.name = wine1Dictionary["name"] as! String?
wine.setValuesForKeys(wine1Dictionary)
self.wineList.append(wine)
print(wine.name)
}
}
})
关于swift - 如何比较所选行的答案并从 firebase 中检索答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42453436/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!