根据用户名显示Firebase数据

时间:2017-02-16 01:27:03

标签: ios swift uitableview firebase firebase-realtime-database

我目前有一个UITableView在单元格中显示Firebase数据库中的帖子。还有另一个UITableView,我想只显示登录用户的帖子。

这是我目前在UserPostViewController中的内容:

func loadData() {
    let uid = FIRAuth.auth()?.currentUser?.uid
    FIRDatabase.database().reference().child("posts").child(uid!).observeSingleEvent(of: .value, with: {
        (snapshot) in
        if let postsDictionary = snapshot.value as? [String: AnyObject] {
            for post in postsDictionary {
                self.userPosts.add(post.value)
            }
            self.userPostsTableView.reloadData()
        }
    })
}

// MARK: - Table view data source

func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // pass any object as parameter, i.e. the tapped row
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.userPosts.count
}

// Displays posts in postsTableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! PostTableViewCell
    // Configure the cell...
    let post = self.userPosts[indexPath.row] as! [String: AnyObject]
    cell.titleLabel.text = post["title"] as? String
    cell.priceLabel.text = post["price"] as? String
    if let imageName = post["image"] as? String {
        let imageRef = FIRStorage.storage().reference().child("images/\(imageName)")
        imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil {
            let image = UIImage(data: data!)
            cell.titleLabel.alpha = 0
            cell.contentTextView.alpha = 0
            cell.postImageView.alpha = 0
            UIView.animate(withDuration: 0.4, animations: {
                cell.titleLabel.alpha = 1
                cell.contentTextView.alpha = 1
                cell.postImageView.alpha = 1
            })
        } else {
            print("Error occured during image download: \(error?.localizedDescription)")
            }
        })
    }
    return cell
}

这也是我在Firebase中的意思:

Here

1 个答案:

答案 0 :(得分:0)

Firebase是一个NoSQL数据库。试图在其上投射SQL实践,会让你感到悲伤。

不是存储一长串帖子,然后使用查询进行过滤,而是将用户特定节点下的每个用户的帖子存储起来。即。

users
  $uid
    username: "gabe"
posts
  $uid
    -K12348: {
      description: "...."
      image: "...."
    }

现在,您可以使用直接访问读取来访问特定用户的帖子,而不是在不断增长的列表中查询:

FIRDatabase.database().reference().child("posts").child(uid!).observeSingleEvent(of: .value, with: {
    (snapshot) in
    if let postsDictionary = snapshot.value as? [String: AnyObject] {
        for post in postsDictionary {
            self.userPosts.add(post.value)
        }
        self.userPostsTableView.reloadData()
    }

请在下次将您的JSON发布为文本,以便我可以将其复制/粘贴到我的答案中。

我建议您阅读NoSQL data modeling并查看Firebase for SQL developers