繁体   English   中英

从Firebase中的数组检索数据

[英]Retrieving data from an array in firebase

我有一个tableView,当前是使用以下fetchAllUsers函数的数据库中所有用户的列表。 如何从每个用户中提取单独的userID并将其传递给另一个函数? 因此,如果我单击表中的第一个用户,是否可以将该用户的特定userID传递给另一个函数?

func fetchAllUsers(completion: @escaping ([User])->()) {

    let userRef = self.databaseRef.child("users")
    userRef.observe(.value, with: { (userdata) in

        var resultsArray = [User]()
        for user in userdata.children {

            let user = User(snapshot: user as! DataSnapshot)
            resultsArray.append(user)

        }

        completion(resultsArray)

    }) { (error) in
        print(error.localizedDescription)
    }

}

首先,为方便起见,可以将以下方法添加到User类中。

static var ref: DatabaseReference {
    return Database.database().reference(withPath: "users")
}

var ref: DatabaseReference {
    return User.ref.child(snapshot.key)
}

以及DataSnapshot的扩展,使将它们映射到User更容易。

extension DataSnapshot {
    var childrenSnapshots: [DataSnapshot] {
        return children.allObjects as? [DataSnapshot] ?? []
    }
}

最后,我们可以重构您的fetchAllUsers函数以利用帮助程序。

func fetchAllUsers(completion: @escaping ([User]) -> ()) {
    User.ref.observe(.value, with: { (snapshot) in
        completion(snapshot.childrenSnapshots.map { User(snapshot: $0) })
    }) { (error) in
        print(error.localizedDescription)
    }
}

现在,所有内容都更易于阅读,让我们考虑一下您的目标-您想从表视图中检索选定用户的ID。 用户的id本质上是用户快照的键,我们使用它来实例化User类。

您的User.init函数应使用快照来填充类属性,因此,您还可以利用此机会来检索快照的键并在User类上设置属性以存储它。 有更好的方法。

// MARK: Properties

var snapshot: DataSnapshot?
var key: String? {
    return snapshot?.key
}

...

// MARK: Lifecycle

init(snapshot: DataSnapshot) {

    self.snapshot = snapshot

    ...
}

使用快照初始化User时,可以存储快照以供以后使用,并使用计算出的属性来检索密钥。 因此,只要将用户存储在数组中,就可以使用所选单元格的indexPath在数组中查找所选用户。

var users: [Users]?

...

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if users?.indices.contains(indexPath.row) == true {
        performSegue(withIdentifier: "showUser", sender: users?[indexPath.row])
    }
}

...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    switch (segue.destination, sender) {
    case (let controller as ViewController, let user as User):
        controller.user = space
    default:
        break
    }
}

一旦有了用户,就拥有了密钥。 一旦选择了一个单元,您将需要执行segue-我喜欢使用sender参数来传递与segue相关的任何内容。 例如,您可以传递所选的User对象并将其设置在目标控制器中。

如果我假设您的模型User具有userId,并且您已经提到要在resultsArray中获取所有用户数据,并将其填充到tableView中。

现在,在选择tableView的任何行时,您可以通过实现UITableView的didSelectRowAt委托来获取个人用户数据。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let individualUser : User = resultsArray[indexPath.row]
    self.anotherFunc(individualUser.userId)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM