仅显示当前用户的帖子 - firebase swift

时间:2016-09-20 13:06:04

标签: swift uitableview firebase firebase-realtime-database

我有一些代码可以获取每个帖子并在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字符串 - 我无法弄清楚如何更新我的代码来做到这一点。希望你们能帮助我: - )

2 个答案:

答案 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是否与你的用户相匹配,但是如果你有一个大的数据库则会占用一些带宽