使用 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
确保 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)
})
我正在从我的 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
确保 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)
})