我正在加载UITableView
,其中最初使用User
从Firebase
提取的observeSingleEvent
数据,我理解在初次读取后不会附加观察者。
我还在每个单元格中都有一个图标,该图标在用户在线/离线时会更新。为此,我将observe
单元委托方法中对特定User
子节点的任何更改附加到观察者willDisplay
上,并在didEndDisplaying
方法中移除观察者。
这是我第一次这样做,并且工作正常,但是在继续之前,我想知道这是否是最初加载数据然后观察更改的行业标准方法,以便可以为每个单元格相应地更新视图。 / p>
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结构
答案 0 :(得分:0)
我想知道这是否是行业标准方式
这不是行业标准方法,应避免使用,因为这会导致UI闪烁和响应缓慢。但是,在编码方面,通常没有“标准”,因为为解决问题而编写的代码将根据用例和所需结果而有所不同。
您的tableView数据源应首先从Firebase填充,然后在发生更改时进行更新;将由Firebase事件启动。数据源更新后,请刷新tableView。
这将使应用程序保持响应速度,并使您的用户感到满意。
另一件事是,您似乎在同一(用户)节点内附加了多个观察者。可能没有必要;将您的观察者附加到/ users节点,然后您将收到有关添加,更改或删除事件的通知,并且无论受影响哪个用户,都将作为快照传递到Firebase闭包中。