【发布时间】:2020-03-04 00:10:54
【问题描述】:
我有一个观察功能,可以显示添加到 Firebase 实时数据库的项目。
func observerMessages(completion: @escaping (FireBaseResponse, MessageDataModel) -> Void) {
let ref = Database.database().reference().child(FireBaseConstants.Database.messages).queryOrdered(byChild: FireBaseConstants.Database.timestamp).queryEnding(atValue: firstMessageTimestamp)
ref.observe(.childAdded) { (snapshot) in
if let dict = snapshot.value as? [String:Any] {
if let username = dict["username"] as? String,
let timestamp = dict["timestamp"] as? Int,
let text = dict["text"] as? String,
let senderId = dict["senderId"] as? String {
let message = MessageData(username: username, timestamp: timestamp, text: text, senderId: senderId, messageId: snapshot.key)
print("observeMessages")
completion(.success, message)
}
}
}
}
问题是这个函数会触发所有已经在数据库中的项目。所以它检索这个孩子的所有数据。我希望它检索仅在调用此函数后添加的数据。
【问题讨论】:
-
该函数将为数据库中符合条件的每个项目触发一次(例如,它允许您填充 tableView 数据源),此后仅对添加的新子项触发。只需更改您的条件以返回具有当前调用函数时间之后的时间戳的子项。它不会立即返回任何孩子,之后只会返回新的孩子。