firebaseui-ios FirebaseTableViewDataSource 与 UITableView 同步
Posted
技术标签:
【中文标题】firebaseui-ios FirebaseTableViewDataSource 与 UITableView 同步【英文标题】:firebaseui-ios FirebaseTableViewDataSource synchronisation with UITableView 【发布时间】:2016-03-07 18:04:11 【问题描述】:我正在使用 FirebaseUI-ios 和 FirebaseTableViewDataSource 绑定到我的 UITableView。对于我的实现,UITableView 应该以“待定”状态显示邀请以连接用户,类似于 LinkedIn。存储在 Firebase 中的邀请数据有一个状态键,可以是“待处理”、“已接受”或“已拒绝”。在用户接受/拒绝邀请后,我正在努力让 UITableView 更新并仅显示“待定”行。当前发生的情况是 UITableView 单元格被更新(名称标签更改为其默认文本),但仍显示单元格。似乎 UITableView 绑定到用户的'received'节点下的所有行,而不是在状态!='pending'时响应。
我在 Firebase 中的数据结构如下:
Firebase 'Invitation' data structure
我在 ViewDidLoad() 中使用以下代码来初始化 FirebaseTableViewDataSource 并填充单元格:
//Initialise a Firebase reference to the authorised user's 'received' invitations data
self.ref = Firebase(url: "\(kFBInvitationsUsersRef)/\(authData.uid)/received")
//Query the location for invitations where the status is pending only
self.ref.queryOrderedByChild("status").queryStartingAtValue(InvitationStatus.pending.rawValue).queryEndingAtValue(InvitationStatus.pending.rawValue).observeEventType(.ChildChanged , withBlock: (snapshot) in
)
//Assign the tableview datasource to a new FirebaseTableViewDataSource instance using the Firebase ref created above
self.dataSource = FirebaseTableViewDataSource(query: self.ref, modelClass:nil, prototypeReuseIdentifier: "invitationCell", view: self.tableView)
//Call the populateCellWithBlock method and configure the cell
self.dataSource.populateCellWithBlock (cell: UITableViewCell, obj: NSObject) -> Void in
let cell = cell as! InvitationTableViewCell
let snap = obj as! FDataSnapshot
if let status = snap.value["status"] as? String where status == InvitationStatus.pending.rawValue
let userRef = Firebase(url: "\(kFBUsersPublicRef)/\(snap.key)")
userRef.observeSingleEventOfType(.Value, withBlock: snapshot in
let user = User(key: snapshot.key, displayName: snapshot.value["displayName"] as! String, givenName: snapshot.value["givenName"] as! String, familyName: snapshot.value["familyName"] as! String)
cell.user = user
cell.delegate = self
)
self.tableView.dataSource = self.dataSource
self.tableView.delegate = self
谁能帮助诊断我在这里做错了什么?我的方法正确吗?
感谢您提供的任何帮助!
【问题讨论】:
目前还不清楚您要做什么。您是否要查询所有待处理并根据该查询填充 tableView(Firebase 处理过滤)?或者你想用待处理填充一个tableView,结果在代码中被过滤?你想观察正在进行的变化吗?如果您还没有这样做,请查看Build Better Mobile Apps。记下 iOS 快速入门代码并以此为基础。如果您简化代码,答案可能会自行呈现。 @Jay,感谢您的意见,如果要求不明确,请见谅。我试图让 tableView 显示所有状态为待处理的行。当用户通过点击单元格中的接受或拒绝按钮更新状态时,该行将从 tableView 中消失。我想通过观察状态键的变化来实现这一点。现有代码基于您提供的链接中描述的结构。 问题:为什么 queryOrderedByChild 有一个空块? - 该块是查询返回时调用的块。此外,queryEqualToValue("pending") 可能更清楚,如果这就是您要查找的内容。如果目的是查询待处理,那么为什么还要检查代码中的“待处理”?此语句是否正确:当用户点击接受或拒绝时,该更改会写入 Firebase,而 Firebase 又会重新加载 tableView? 【参考方案1】:我已经改变了我的方法来寻找解决方案。我在 Firebase 中修改了我的数据结构,使状态成为键。然后我将 FirebaseTableViewDataSource 绑定到“待定”键的引用。当用户接受/拒绝邀请时,它会从“待处理”节点中删除并在“接受”/“拒绝”节点上创建。现在,当添加新的“待处理”邀请或接受/拒绝现有的“待处理”邀请时,tableView 会按预期更新。
【讨论】:
以上是关于firebaseui-ios FirebaseTableViewDataSource 与 UITableView 同步的主要内容,如果未能解决你的问题,请参考以下文章