gpt4 book ai didi

ios - 如何使用 firebase 从数据库中提取用户并在 TableView 中列出它们?

转载 作者:行者123 更新时间:2023-11-28 06:15:32 25 4
gpt4 key购买 nike

我正在使用 firebase 制作 iOS 应用。我想检索数据库中的所有用户,并在表格 View 中显示他们的姓名和个人资料图片。这是我的 TableViewCell 代码:

import UIKit
import FirebaseDatabase
import FirebaseAuth
import SDWebImage

class HomeTableViewCell: UITableViewCell {


@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var likeImageView: UIImageView!
@IBOutlet weak var messageImageView: UIImageView!
@IBOutlet weak var likeCountButton: UIButton!

var homeVC: HomeViewController?
var postReference: DatabaseReference!

var post: UserFile?{
didSet {
updateView()
}
}

var user: UserFile? {
didSet {
updateUserInfo()
}
}

override func awakeFromNib() {
super.awakeFromNib()

nameLabel.text = ""

let berryTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleLikeTap))

likeImageView.addGestureRecognizer(berryTapGesture)
likeImageView.isUserInteractionEnabled = true

}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}

func updateView() {
if let photoURL = post?.picURL {
profileImageView.sd_setImage(with: URL(string: photoURL))
}

API.Post.REF_POSTS.child(post!.id!).observeSingleEvent(of: .value, with: { postSnapshot in
if let postDictionary = postSnapshot.value as? [String:Any] {
let post = UserFile.transformPost(postDictionary: postDictionary, key: postSnapshot.key)
self.updateLike(post: post)
}
})
API.Post.REF_POSTS.child(post!.id!).observe(.childChanged, with: { snapshot in
if let value = snapshot.value as? Int {
self.likeCountButton.setTitle("\(value) berries", for: .normal)
}
})
}

func updateLike(post: UserFile) {
let imageName = post.berries == nil || !post.isBerried! ? "berry" : "berrySelected"
likeImageView.image = UIImage(named: imageName)

// display a message for berries
guard let count = post.berryCount else {
return
}

if count != 0 {
likeCountButton.setTitle("\(count) berries", for: .normal)
} else if post.berryCount == 0 {
likeCountButton.setTitle("Be the first to Like this", for: .normal)
}
}

func incrementberries(forReference ref: DatabaseReference) {
ref.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in
if var post = currentData.value as? [String : AnyObject], let uid = Auth.auth().currentUser?.uid {
var berries: Dictionary<String, Bool>
berries = post["berries"] as? [String : Bool] ?? [:]
var likeCount = post["berryCount"] as? Int ?? 0
if let _ = berries[uid] {
// Unlike the post and remove self from stars
likeCount -= 1
berries.removeValue(forKey: uid)
} else {
// Like the post and add self to stars
likeCount += 1
berries[uid] = true
}
post["berryCount"] = likeCount as AnyObject?
post["berries"] = berries as AnyObject?

currentData.value = post

return TransactionResult.success(withValue: currentData)
}
return TransactionResult.success(withValue: currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
}

if let postDictionary = snapshot?.value as? [String:Any] {
let post = UserFile.transformPost(postDictionary: postDictionary, key: snapshot!.key)
self.updateLike(post: post)
}
}
}

func handleLikeTap() {
postReference = API.Post.REF_POSTS.child(post!.id!)
incrementberries(forReference: postReference)
}

override func prepareForReuse() {
super.prepareForReuse()
profileImageView.image = UIImage(named: "industribune-default-no-profile-pic")
}

func updateUserInfo() {
nameLabel.text = user?.username
if let photoURL = user?.profileImageURL {
profileImageView.sd_setImage(with: URL(string: photoURL), placeholderImage: UIImage(named: "industribune-default-no-profile-pic"))
}
}


}

我在我的 HomeViewController 上显示这个单元格:

import UIKit
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import Firebase

class HomeViewController: UIViewController {


@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!

var posts = [UserFile]()
var users = [UserFile]()

override func viewDidLoad() {
super.viewDidLoad()
// for performance set an estimated row height
tableView.estimatedRowHeight = 1
// but also request to dynamically adjust to content using AutoLayout
tableView.rowHeight = UITableViewAutomaticDimension

//tableView.delegate = self
tableView.dataSource = self

loadPosts()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func loadPosts() {
activityIndicatorView.startAnimating()

API.User.observePosts { (newPost) in
guard let userID = newPost.uid else { return }
self.fetchUser(uid: userID, completed: {
// append the new Post and Reload after the user
// has been cached
self.posts.append(newPost)
self.activityIndicatorView.stopAnimating()
self.tableView.reloadData()
})
}
}

func fetchUser(uid: String, completed: @escaping () -> Void) {

API.User.observeUser(withID: uid) { user in
self.users.append(user)

completed()
}
}


}

extension HomeViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeTableViewCell", for: indexPath) as! HomeTableViewCell

cell.post = posts[indexPath.row]
cell.user = users[indexPath.row]
cell.homeVC = self

return cell
}

}

我的项目中发生了很多疯狂的事情,所以如果您有任何问题请告诉我以及我做错了什么。如果它太复杂而难以理解,我准备好清除所有内容并重新开始。

老实说,我确实认为我遵循了所有的指导方针来提出问题,所以不喜欢关闭这个问题或其他东西。

最佳答案

那是很多代码。试试这个 super 简化的例子。为此,用户节点仅将名称存储为子节点,但它也可以包含图像、电子邮件、地址等。

示例用户节点

users
uid_0:
name: "Bert"
uid_1:
name: "Ernie"

和一些代码

var usersArray = [ [String: Any] ]()  //an array of dictionaries.

class ViewController: UIViewController {
//set up firebase references here
override func viewDidLoad() {
super.viewDidLoad()

let usersRef = self.ref.child("users")
usersRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let userDict = snap.value as! [String: Any]
self.usersArray.append(userDict)
}
self.tableView.reloadData()
})

和 tableView 委托(delegate)方法

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.usersArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeTableViewCell", for: indexPath) as! HomeTableViewCell

let userDict = self.usersArray[indexPath.row]
cell.text = userDict["name"] as! String
//cell.imge = userDict["image"] etc etc

return cell
}

现在……话虽如此。这是 UserClass 对象数组而不是字典的完美用法。

这是一个起点......

class UserClass {
var name = ""
var image = ""

func init(snap: DataSnapshot) {
//populate the vars from the snapshot
}
}

var userClassArray = [UserClass]()

请勿复制粘贴,因为可能有错别字,但它应该能为您指明正确的方向。

关于ios - 如何使用 firebase 从数据库中提取用户并在 TableView 中列出它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45244401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com