Я загружаю UITableView
с User
данными, извлекаемыми из Firebase
, первоначально используя observeSingleEvent
, который, как я понимаю, не присоединяет наблюдателя после первоначального чтения.
У меня также есть значок в каждой ячейке, который обновляется, когда пользователь онлайн / оффлайн. Для этого я присоединяю наблюдателя к observe
любым изменениям определенного дочернего узла User
в моем методе делегата ячейки willDisplay
и удаляю наблюдателя в методе didEndDisplaying
.
Я делаю это впервые и работаю правильно, но перед тем, как продолжить, я хочу узнать, является ли это отраслевым стандартным способом первоначальной загрузки данных с последующим наблюдением за изменениями, чтобы представление можно было соответствующим образом обновить для каждой ячейки.
cellForRowAt
метод, который удаляет и настраивает ячейку:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ConversationsListCell", for: indexPath) as? ConversationsListCell else { return UITableViewCell() }
let message = messages[indexPath.row]
DataService.run.getUserInfo(forUserId: message.chatPartnerId()!) { (user) in
cell.configureCell(message: message, user: user)
}
return cell
}//end func
willDisplay
метод присоединяет наблюдателя к определенному дочернему узлу и запускает tableView.reload (), если есть какие-либо изменения в узле:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let message = messages[indexPath.row]
DataService.run.observeUserNodeChages(forId: message.chatPartnerId()!) { (user) in
self.tableView.reloadData()
}
}//end func
didEndDisplaying
метод удаляет наблюдателя, прикрепленного методом willDisplay
:
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row < messages.count {
let message = messages[indexPath.row]
DataService.run.removeObserveUserNodeChages(forId: message.chatPartnerId()!)
}
}//end func
observeUserNodeChages
, который прослушивает любые изменения в определенном uid
дочернем узле
func observeUserNodeChages (forId: String, handler: @escaping (Bool) -> ()){
print("inside observeUserNodeChages forId:\(forId)")
conversationListHandle = REF_USERS.child(forId).observe(.childChanged, with: { (snapshot) in
handler(true)
}, withCancel: nil)
}//end func
user
узел структуры Firebase
![enter image description here](https://i.stack.imgur.com/578NV.png)