使用 nextObject() 枚举集合没有按预期工作?

Enumerating a collection with nextObject() does not work as intended?

我正在从我的 Firebase 存储中获取一些数据。数据以快照形式到达:

FirebaseDatabase.userMessagesReference?.child(contact.uid).queryOrderedByKey().queryEnding(atValue: lastMessage?.key ?? latestMessage?.key).queryLimited(toLast: 10).observeSingleEvent(of: .value, with: { (messageKeysSnapshot) in
        while let childSnap = messageKeysSnapshot.children.nextObject() as? DataSnapshot {
            print(childSnap)
        }
    }, withCancel: { (error) in
        print(error.localizedDescription)
    })

我想获取 children 数组的每个 child。不幸的是,似乎出了点问题,它没有按预期工作。不是返回 while-loop 中的每个 child,第一个 child 只是无限次返回(数据库中至少有 10 条消息)。
另外,当检查 messageKeysSnapshot 并将其打印到控制台时(通过设置断点等...),我可以看到有几个 children。我绝对认为 children 枚举器有问题。

我怎样才能得到每个 child 一次?

messageKeysSnapshot.children returns 一个 NSEnumerator 对象,知道如何一个一个地检索对象。枚举器有它自己的状态并跟踪它给你的东西。这个想法是获取枚举器一次,然后对其重复调用 .nextObject() 。问题在于,您不是只获取一次枚举器,而是每次通过循环获取一个新副本,这解释了为什么您一遍又一遍地看到第一项。

相反,将枚举器分配给 let 然后引用它:

FirebaseDatabase.userMessagesReference?.child(contact.uid).queryOrderedByKey().queryEnding(atValue: lastMessage?.key ?? latestMessage?.key).queryLimited(toLast: 10).observeSingleEvent(of: .value, with: { (messageKeysSnapshot) in
    let enumerator = messageKeysSnapshot.children
    while let childSnap = enumerator.nextObject() as? DataSnapshot {
        print(childSnap)
    }
}, withCancel: { (error) in
    print(error.localizedDescription)
})

或者,您可以使用直接与枚举器一起使用的 for in 循环,并使用 case let 确保 childSnapDataSnapshot:

FirebaseDatabase.userMessagesReference?.child(contact.uid).queryOrderedByKey().queryEnding(atValue: lastMessage?.key ?? latestMessage?.key).queryLimited(toLast: 10).observeSingleEvent(of: .value, with: { (messageKeysSnapshot) in
    for case let childSnap as DataSnapshot in messageKeysSnapshot.children {
        print(childSnap)
    }
}, withCancel: { (error) in
    print(error.localizedDescription)
})