如何添加搜索用户功能?

时间:2020-06-15 02:53:05

标签: ios swift google-cloud-firestore

我已经尝试添加搜索用户机制已经有一段时间了,但是没有成功。我似乎找不到太多东西了,那里有解释的地方几乎总是针对FirebaseDatabase而不是Firestore。我对Swift,Firebase和编码一般还是很陌生,因此,只要不加任何文字,就可以对我错在哪里以及如何实现此问题进行任何解释。

这是我的最新尝试(我相信这会使很多人颤抖):

import UIKit
import Firebase
import FirebaseAuth
import FirebaseFirestore

class FindUsersViewController: UITableViewController {

    var usersArray = [String]()
    var filteredUsers = [String]()


    override func viewDidLoad() {
        super.viewDidLoad()




        fetchUser()


        // Do any additional setup after loading the view.
    }


            func fetchUser() {
                    let db = Firestore.firestore()
                    let usernameSearch = db.collection("users")
                    usernameSearch.getDocuments { (snapshot, error) in
                        if error != nil {
                            print("Error obtaining usernames")
                        } else {
                            for document in snapshot!.documents {
                                let field = document.data()["username"]
                                self.usersArray.append(field as! String)
                                print(self.usersArray)

                            }

                        }

                    }


            }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 5
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = usersArray
        return cell
    }



}

我似乎不太能解决问题,而且由于我是新手,因此Firebase文档似乎比启发更神秘,因此,对此提供的任何帮助将不胜感激!

(我想我在Arrays上出错了...也许... idk ...)

- 我应该补充: 我有一个“用户”集合,其中每个用户的文档都包含“用户名”字段(以及uid,密码和电子邮件字段)。

1 个答案:

答案 0 :(得分:1)

您快到了!

首先让我们创建一个User对象,该对象代表用户的所有属性。现在,假设用户有一个ID,一个名称和一封电子邮件,但可以随时满足您的项目要求:

import FirebaseFirestore

struct User {
    let id: String
    let name: String
    let email: String
}

我们还为用户添加了带有便捷初始化程序的扩展名,这将使我们能够快速轻松地将Firestore文档转换为用户:

extension User {

    init(queryDocument: QueryDocumentSnapshot) {
        guard let name = queryDocument.data()["name"] as? String else { fatalError() }
        guard let email = queryDocument.data()["email"] as? String else { fatalError() }
        self.init(id: queryDocument.documentID, name: name, email: email)
    }
}

现在,这就是您的FindUsersViewController的样子:

import UIKit
import FirebaseFirestore

class FindUsersViewController: UITableViewController {

    // Keep a reference to your database, and your users collection:
    private let database = Firestore.firestore()
    private lazy var usersReference = database.collection("users")

    private let cellReuseIdentifier = "cellReuseIdentifier"
    // This is the array that will keep track of your users, you will use it to populate your table view data:
    private var users = [User]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Set your table view datasource and delegate:
        tableView.dataSource = self
        tableView.delegate = self
        // Register your cell identifier:
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        fetchUsers()
    }

    private func fetchUsers() {
        // Create your query, for instance we will return only the first 10 users and ordered by name:
        let query = usersReference.order(by: "name", descending: true).limit(to: 10)
        // Now simply fetch the documents that match the query:
        query.getDocuments { [weak self] (querySnapshot, error) in
            guard let self = self else { return }
            guard let querySnapshot = querySnapshot, error == nil else {
                // Oops, something wrong happened here
                return
            }
            // You get successfully your documents here, so just transform them to your User model:
            let users = querySnapshot.documents.map { User(queryDocument: $0) }
            // Then fill your array, and make sure you reload your table data on the main thread:
            DispatchQueue.main.async {
                self.users = users
                self.tableView.reloadData()
            }
        }
    }

    // MARK: UITableViewDataSource methods

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Returns the number of users in your array:
        return users.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
        // Configure your cell here via your users array:
        cell.textLabel?.text = users[indexPath.row].name
        return cell
    }

    // MARK: UITableViewDelegate methods

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
}

这将为您提供一个不错的用户列表。我在视图控制器中添加了很多注释,因此我认为这很不言自明,但是如果您仍有疑问,请随时告诉我。

祝您的应用程序好运! :)