【问题标题】:Enumerating a collection with nextObject() does not work as intended?使用 nextObject() 枚举集合不能按预期工作?
【发布时间】:2019-01-12 04:38:29
【问题描述】:

我正在从我的 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 枚举器有问题。

我怎样才能让每个孩子都一次?

【问题讨论】:

  • 你看过stackoverflow.com/questions/27341888/…吗?在那里,他们没有使用while
  • 谢谢@CarstenHagemann 是的,他的建议是使用while循环。 (引用:A better way might be:...

标签: swift firebase firebase-realtime-database enumeration


【解决方案1】:

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)
})

【讨论】:

  • 我不知道for case let。看起来不错,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多