【发布时间】:2020-10-11 08:55:23
【问题描述】:
当用户滚动对话表视图时,我有以下函数被调用,它运行良好,但如果剩余的孩子小于指定的数量,它不会检索!更有趣的是,这些值出现在print(snapshot.value) 中,但不在print(child) 中。即使小于指定数量,如何获取所有节点?
谢谢。
func fetchBatch(betweenUser userID: String, fromTimestamp: Double , completion: @escaping([Message]) -> ()){
guard let currentUID = Auth.auth().currentUser?.uid else { return }
var messages = [Message]()
REF_MESSAGES.child(currentUID).child(userID).queryOrdered(byChild: "timestamp").queryEnding(atValue: fromTimestamp).queryLimited(toLast: 20).observeSingleEvent(of: .value) { snapshot in
print(snapshot.value)
for child in snapshot.children {
print(child)
if let childSnapshot = child as? DataSnapshot {
guard let dictionary = childSnapshot.value as? [String: AnyObject] else {return}
let message = Message(dictionary: dictionary)
messages.append(message)
}
}
return completion(messages)
}
}
【问题讨论】:
-
嗯。我没有看到这种行为。
toLast设置从有序结果列表末尾返回的最大项目数,如果更少,它可以返回更少。在您的代码中,snapshot.value 是所有子节点,然后 for 循环中的子节点是每个子节点 - 它是相同的数据。如果您将子项转换为数组let allData = snapshot.children.allObjects as! [DataSnapshot]然后遍历 allData - 结果相同会怎样? -
感谢@Jay 的回答。确切地!两者应该具有相同的数据。这就是为什么我觉得它很奇怪。尝试了您的建议,但不幸的是产生了相同的结果。
-
我认为快照不可能有两组不同的数据。你还有其他事情要发生。
-
@Jay 这就是我想要弄清楚的,导致这个错误的东西,我认为它是函数本身的东西,因为在它的范围内发生的所有事情甚至在返回数组之前.
-
只是猜测,但您的数据结构可能有问题。如果消息数组失败或失败,则该保护语句将阻止填充消息数组。所以我的猜测是你正在检索 10 个子笔记,你对前 7 个然后第 8 个的迭代使保护语句失败,所以看起来你检索的比你有的少。
标签: swift firebase firebase-realtime-database