首先,爲方便起見,下面介紹一些可以添加到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' – 3stud1ant3