gpt4 book ai didi

arrays - 从 firebase 中的数组中检索数据

转载 作者:行者123 更新时间:2023-11-28 15:19:10 24 4
gpt4 key购买 nike

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

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)
}
}

现在一切都更容易阅读了,让我们考虑一下您的目标 - 您想要从 TableView 中检索选定用户的 ID。用户的id本质上就是用户快照的key,我们用它来实例化User类。

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

// MARK: Properties

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

...

// MARK: Lifecycle

init(snapshot: DataSnapshot) {

self.snapshot = snapshot

...
}

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

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
}
}

一旦你有了你的用户,你就拥有了你的 key 。一旦选择了一个单元格,您将需要执行一个 segue - 我喜欢使用 sender 参数将任何相关的内容传递给 segue。例如,您可以传递选定的 User 对象并将其设置在目标 Controller 中。

关于arrays - 从 firebase 中的数组中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46313083/

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