我有一些代码可以获取每个帖子并在uitableviewcontroller中显示所有内容。从firebase获取所有帖子的代码是:
viewDidLoad {
dbRef = FIRDatabase.database().reference().child("feed-items")
startObersvingDB()
}
func startObersvingDB() {
dbRef.observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
var newUpdates = [Sweet]()
for update in snapshot.children {
let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(updateObject)
}
self.updates = newUpdates
self.tableView.reloadData()
}) { (error: NSError) in
print(error.description)
}
}
如何修改该部分以仅从特定用户名获取更新? 我在firebase中的结构是这样的:
feed-items {
unique-user-id {
post: "This is a post"
byUsername: "MyUser"
}
}
所以代码应该做的是获取byUsername字符串 - 我无法弄清楚如何更新我的代码来做到这一点。希望你们能帮助我: - )
答案 0 :(得分:3)
试试这个: -
Swift 3
func startObersvingDB() {
FIRDatabase.database().reference().child("feed-items").queryOrdered(byChild: "byUsername").queryEqual(toValue: "MyUser").observe(.value, with: { (snapshot: FIRDataSnapshot) in
var newUpdates = [Sweet]()
for update in snapshot.children {
let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(updateObject)
}
self.updates = newUpdates
self.tableView.reloadData()
}) { (err) in
print(err!.localisedDescription)
}
}
Swift 2
func startObersvingDB() {
FIRDatabase.database().reference().child("feed-items").queryOrderedbyChild("byUsername").queryEqualtoValue("MyUser").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
var newUpdates = [Sweet]()
for update in snapshot.children {
let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(updateObject)
}
self.updates = newUpdates
self.tableView.reloadData()
}) { (error: NSError) in
print(error.description)
}
}
答案 1 :(得分:0)
从我收集到的信息中,您将feed-items
的每个孩子都抓取for update in snapshot.children {...}
您永远不会使用密钥unique-user-id
来实际获取特定的用户ID。您必须编写database rule以允许用户仅查看自己的项目,或者您可以使用以下方法(Swift 3语法):
1)从FIRAuth获取用户ID:
if let user = FIRAuth.auth()?.currentUser {
for profile in user.providerData {
providerDataID = profile.providerID // save UID in variable e.g. providerDataID
// fetch other FIRAuth stuff
}
2)只使用您的UID获取Feed项:
ref.child("feed-items").child(providerDataID).observeSingleEvent(of: .value, with: { (snapshot) in
if let userInfoDict = snapshot.value as? NSDictionary {
// get values from the proper providerDataID ONLY
}
<强>替代:强> 在你的代码中进行for循环检查时,检查每个孩子的UID是否与你的用户相匹配,但是如果你有一个大的数据库则会占用一些带宽