用nextObject()枚举集合不能按预期工作吗?

时间:2018-08-04 15:17:34

标签: swift firebase firebase-realtime-database enumeration

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

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

1 个答案:

答案 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来确保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)
})