使用nextObject()枚举集合是否无法按预期工作



我正在从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)
})

我想得到每个孩子的阵列。不幸的是,似乎出了问题,它并没有像预期的那样工作。第一个子代不是返回while循环中的每个子代,而是无限次返回(数据库中至少有10条消息(
此外,当检查messageKeysSnapshot并将其打印到控制台(通过设置断点等…(时,我可以看到有几个子级。我肯定认为children枚举器有问题。

我怎么能让每个孩子都有一次?

messageKeysSnapshot.children返回一个知道如何逐个检索对象的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)
})

最新更新