【问题标题】:Retrieving data from an array in firebase从firebase中的数组中检索数据
【发布时间】:2017-09-20 04:02:40
【问题描述】:

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

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的代码

标签: arrays swift firebase swift3 firebase-realtime-database


【解决方案1】:

首先,为方便起见,您可以添加一些方法到 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 对象并将其设置在目标控制器中。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      相关资源
      最近更新 更多