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