如何从数据库中提取用户并使用firebase在表视图中列出它们?

时间:2017-07-21 18:25:30

标签: ios swift firebase

我使用firebase制作iOS应用。我想检索数据库中的所有用户,并在表格视图中显示他们的名字和个人资料图片。这是我的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
    }

}

我的项目中有很多疯狂,所以如果您有任何问题以及我做错了,请告诉我。如果它太复杂而无法理解我已准备好擦除所有内容并重新开始。

我诚实地认为我遵循了所有指导方针来提出问题,所以不要把这个问题关闭或者其他什么。

1 个答案:

答案 0 :(得分:1)

这是很多代码。试试这个超级减少的例子。为此,users节点仅将名称存储为子节点,但也可以包含图像,电子邮件,地址等。

示例用户节点

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委托方法

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]()

请勿复制并粘贴此内容,因为可能存在拼写错误,但它应该指向正确的方向。