【问题标题】:Show only posts from current user - firebase swift仅显示当前用户的帖子 - firebase swift
【发布时间】:2016-09-20 13:06:04
【问题描述】:

我有一些代码可以获取每个帖子并将其全部显示在 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 字符串 - 我只是不知道如何更新我的代码来做到这一点。希望你们能帮助我:-)

【问题讨论】:

    标签: swift uitableview firebase firebase-realtime-database


    【解决方案1】:

    试试这个:-

    斯威夫特 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)      
          }
       }
    

    斯威夫特 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)
        }
      }
    

    【讨论】:

      【解决方案2】:

      据我所知,您正在使用for update in snapshot.children {...} 获取feed-items 的每个孩子您从未使用密钥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 获取提要项:

      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 是否与您的用户匹配,但如果您有一个大型数据库,这将占用一些带宽

      【讨论】:

      • 唯一的用户 ID 被“跳过”,因为我只寻找 snapshot.children - 但有人已经找到了我的答案 :-) 感谢您抽出宝贵的时间!
      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多