从 Firebase 词典中获取结果?
Get results from Firebase dictionary?
我能够从 Firebase 查询中检索结果,但我无法将它们作为字典检索以填充 tableView。以下是我存储查询结果的方式:
var invites: Array<FIRDataSnapshot> = []
func getAlerts(){
let invitesRef = self.rootRef.child("invites")
let query = invitesRef.queryOrderedByChild("invitee").queryEqualToValue(currentUser?.uid)
query.observeEventType(.Value, withBlock: { snapshot in
self.invites.append(snapshot)
print(self.invites)
self.tableView.reloadData()
})
}
打印self.invitesreturns以下内容:
[Snap (invites) {
"-KKQWErkyuehmbxom8NO" = {
invitedBy = T2k7Bm9G9RNLcHLvLlKApRbnas23;
invitee = dRJ1FqctSfTlLF8iO2ddlc9BANJ3;
role = guardian;
};
}]
我在填充 tableView 时遇到问题。单元格标签不显示任何内容:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let inviteDict = invites[indexPath.row].value as! [String : AnyObject]
let role = inviteDict["role"] as? String
cell.textLabel!.text = role
return cell
}
有什么想法吗?
谢谢!
编辑:在我的函数 运行 之后打印字典到控制台,它正在打印 []
。为什么它会失去它的价值?
override func viewWillAppear(animated: Bool) {
getAlerts() // inside of function prints values
print(self.invites) //prints []
}
编辑 2:Paul 的解决方案有效!!我添加了以下函数以获得 Firebase "listen" 的结果!我可能需要对其进行编辑以仅显示登录用户的警报,但这至少为我指明了正确的方向:
override func viewWillAppear(animated: Bool) {
getAlerts()
configureDatabase()
}
func configureDatabase() {
// Listen for new messages in the Firebase database
let ref = self.rootRef.child("invites").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
self.invites.append(snapshot)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.invites.count-1, inSection: 0)], withRowAnimation: .Automatic)
})
}
您的数组将始终 return [ ] 因为 Firebase 是异步的。如果您在 Firebase 闭包内添加 var invites: Array<FIRDataSnapshot> = []
,您将打印您正在寻找的数据,但我假设您希望在闭包外部使用该变量。为了完成,您必须在 getAlerts()
函数中创建一个完成。如果您不确定如何完成,请进行 google 搜索,这将解决您的问题。
查看 friendlychat Firebase codelab for an example of populating a table view from an asynchronous call. Specifically, see viewDidLoad and configureDatabase in FCViewController.swift。
我能够从 Firebase 查询中检索结果,但我无法将它们作为字典检索以填充 tableView。以下是我存储查询结果的方式:
var invites: Array<FIRDataSnapshot> = []
func getAlerts(){
let invitesRef = self.rootRef.child("invites")
let query = invitesRef.queryOrderedByChild("invitee").queryEqualToValue(currentUser?.uid)
query.observeEventType(.Value, withBlock: { snapshot in
self.invites.append(snapshot)
print(self.invites)
self.tableView.reloadData()
})
}
打印self.invitesreturns以下内容:
[Snap (invites) {
"-KKQWErkyuehmbxom8NO" = {
invitedBy = T2k7Bm9G9RNLcHLvLlKApRbnas23;
invitee = dRJ1FqctSfTlLF8iO2ddlc9BANJ3;
role = guardian;
};
}]
我在填充 tableView 时遇到问题。单元格标签不显示任何内容:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let inviteDict = invites[indexPath.row].value as! [String : AnyObject]
let role = inviteDict["role"] as? String
cell.textLabel!.text = role
return cell
}
有什么想法吗?
谢谢!
编辑:在我的函数 运行 之后打印字典到控制台,它正在打印 []
。为什么它会失去它的价值?
override func viewWillAppear(animated: Bool) {
getAlerts() // inside of function prints values
print(self.invites) //prints []
}
编辑 2:Paul 的解决方案有效!!我添加了以下函数以获得 Firebase "listen" 的结果!我可能需要对其进行编辑以仅显示登录用户的警报,但这至少为我指明了正确的方向:
override func viewWillAppear(animated: Bool) {
getAlerts()
configureDatabase()
}
func configureDatabase() {
// Listen for new messages in the Firebase database
let ref = self.rootRef.child("invites").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
self.invites.append(snapshot)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.invites.count-1, inSection: 0)], withRowAnimation: .Automatic)
})
}
您的数组将始终 return [ ] 因为 Firebase 是异步的。如果您在 Firebase 闭包内添加 var invites: Array<FIRDataSnapshot> = []
,您将打印您正在寻找的数据,但我假设您希望在闭包外部使用该变量。为了完成,您必须在 getAlerts()
函数中创建一个完成。如果您不确定如何完成,请进行 google 搜索,这将解决您的问题。
查看 friendlychat Firebase codelab for an example of populating a table view from an asynchronous call. Specifically, see viewDidLoad and configureDatabase in FCViewController.swift。