Во-первых, никогда не используйте NSDictionary
или NSArray
в Swift
, это усложняет ситуацию.Во-вторых, просто отметьте snapshot.exists()
вместо guard
для allObjects
.
for group in groups
следует заменить на for child in snapshot.children
, а child
будет сам DataSnapshot
.См. Ниже код:
REF_GROUPS.observeSingleEvent(of: DataEventType.value) { (snapshot) in
if snapshot.exists() {
var allMessages: Array<Dictionary<String, String>> = []
for child in snapshot.children {
let childSnapshot = child as! DataSnapshot
guard let dictValue = childSnapshot.value as? Dictionary<String, Any>, let messages = dictValue["messages"] as? Dictionary<String, Any> else {continue}
if let array = Array(messages.values) as? Array<Dictionary<String, String>> {
allMessages.append(contentsOf: array)
}
}
/// All messages into single array
print(allMessages)
/// All senderIds
let senderIds = allMessages.map({$0["senderId"]!})
print(senderIds)
/// Unique senderIds
let uniqueSenderIds = Array(Set(senderIds))
print(uniqueSenderIds)
/// Grouping the senderId with messages
var finalDict: Dictionary<String, [String]> = [:]
for data in allMessages {
guard let senderId = data["senderId"], let content = data["content"] else {continue}
if var oldValue = finalDict[senderId] {
oldValue.append(content)
}
else {
finalDict[senderId] = [content]
}
}
print(finalDict)
/// Inbuilt Dictionary grouping function
let dictionary = Dictionary(grouping: allMessages, by: {$0["senderId"]!})
print(dictionary)
}
Вывод: allMessages
[["content": "Its me", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"],["content": "Who are you", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]]
Вывод: senderIds
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2", "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]
Вывод: uniqueSenderIds
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]
Вывод: finalDict
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2": ["Its me", "Who are you"]]
Вывод: finalDict
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2": [["content": "Its me", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"], ["content": "Who are you", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]]]
Я не уверен, почему вы выбираете содержимое всех групп, но я хотел бы предложить получить данные по Groups -> GroupId -> messages
ref и установить прослушиватель для этого ref, чтобы приложение могло получать уведомления при получении нового сообщения..