Swift Firebase:如果子项小于queryLimited中指定的数字,则无法检索子项
我有下面的函数,当用户滚动对话tableview时会被调用,它工作得很好,但是如果剩余的子项小于指定的数字,它将检索不到!更有趣的是,这些值出现在Swift Firebase:如果子项小于queryLimited中指定的数字,则无法检索子项,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我有下面的函数,当用户滚动对话tableview时会被调用,它工作得很好,但是如果剩余的子项小于指定的数字,它将检索不到!更有趣的是,这些值出现在print(snapshot.value)中,而不是print(child)中。如何获取所有节点,即使它们小于指定的数目 多谢各位 func fetchBatch(betweenUser userID: String, fromTimestamp: Double , completion: @escaping([Message]) -> ()){
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)
}
}
只是一个猜测,但您的数据结构可能有问题 那个警卫声明
guard let dictionary = childSnapshot.value as? [String: AnyObject] else {return}
将阻止消息数组在失败时完全填充
我的猜测是,您检索了10个子注释,然后当代码在它们上面迭代时,在某个点上,由于结构的原因,guard语句失败了。例如,用[Int:Any]代替[String:Any]
最终的结果是并非所有的子节点都没有添加到数组中,这反过来意味着数组中的元素比从Firebase中实际检索到的元素要少。Hmm。我没有看到这种行为
toLast
设置从有序结果列表末尾返回的最大项数,如果项数较少,则返回的项数可能会较少。在您的代码中,snapshot.value是所有的子节点,而for循环中的子节点是每个子节点——它是相同的数据。如果将子对象强制转换为数组,会发生什么![DataSnapshot]然后对所有数据进行迭代-结果相同?谢谢@Jay的回答。确切地两者应该有相同的数据。这就是我觉得奇怪的原因。尝试了您的建议,但不幸的是生成了相同的结果。我认为快照不可能有两组不同的数据。你还有别的事情发生。@Jay这就是我想弄清楚的,导致这个错误的原因,我认为这是函数本身的原因,因为在返回数组之前,函数范围内发生的所有事情。只是猜测,但你的数据结构可能有问题。该guard语句将防止在消息数组失败或失败时填充该消息数组。所以我猜你正在检索10个子注释,在前7个子注释上进行迭代,然后在第8个子注释上进行迭代,使guard语句失败,所以看起来你检索的子注释比你检索的要少。