我正在从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数组中的每个孩子。不幸的是,某些事情似乎是错误的,它无法按预期工作。而不是返回while循环中的每个子代,第一个子代只会无限次返回(并且数据库中至少有10条消息)。
另外,在检查messageKeysSnapshot并将其打印到控制台时(通过设置断点等),我可以看到有几个孩子。我绝对认为children
枚举器有问题。
我怎样才能让每个孩子一次?
答案 0 :(得分:2)
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
来确保childSnap
是DataSnapshot
:
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)
})