2017-09-20 149 views
0

我有一個tableView,當前是我的數據庫中所有用戶的列表,使用下面的fetchAllUsers函數。如何從每個用戶提取個人用戶ID並將其傳遞到另一個函數?所以如果我點擊表中的第一個用戶,我可以將該用戶的特定用戶ID傳遞給另一個函數?從firebase數組中檢索數據

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

} 
+1

請顯示你的'User' – 3stud1ant3

回答

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對象並將其設置在目標控制器中。

0

如果我假設您的模型User具有userId,並且您已經提到要獲取resultsArray中的所有用戶數據並將其填充到tableView中。

現在選擇任何一行tableView,你可以通過實現UITableView的didSelectRowAt委託來得到你的個人用戶數據。

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