Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Firebase:如果子项小于queryLimited中指定的数字,则无法检索子项_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift Firebase:如果子项小于queryLimited中指定的数字,则无法检索子项

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]) -> ()){

我有下面的函数,当用户滚动对话tableview时会被调用,它工作得很好,但是如果剩余的子项小于指定的数字,它将检索不到!更有趣的是,这些值出现在
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语句失败,所以看起来你检索的子注释比你检索的要少。