Firebase вложенный разбор Swift - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий запрос Firebase для анализа в моем tableView

{
  "-LC8fVE90ovEFRQAhhdv" : {
    "description" : "Bu grupta arkadaşlar takılsınlar",
    "members" : [ "VSVmIF4o0ie2QMIcXdTDTcC8Hq93", "hJgM5tYU45VmjaMTzYAG4Yo3RyD2", "YrLEyhWf9KOIwoK2YN7HrzxpwMc2" ],
    "title" : "Takılmaca"
  },
  "-LC8wUR-11bX5FnjQ6Mk" : {
    "description" : "Hello",
    "members" : [ "VSVmIF4o0ie2QMIcXdTDTcC8Hq93", "hJgM5tYU45VmjaMTzYAG4Yo3RyD2", "nkwPkD2FeDZZFDnLunTe3D2EuQr2", "YrLEyhWf9KOIwoK2YN7HrzxpwMc2" ],
    "messages" : {
      "-LC9Pj9krCB4kZnXtXc8" : {
        "content" : "Its me",
        "senderId" : "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"
      },"-LC9Pj9krCB4kasfXtXc8" : {
        "content" : "Who are you",
        "senderId" : "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"
      }
}

Я пытаюсь получить контент и senderId с помощью следующего кода

var groupMessages = [Message]()
REF_GROUPS.observeSingleEvent(of: .value) { (groups) in
    guard let groups = groups.children.allObjects as? [DataSnapshot] else { return }

    for group in groups {
        let groupss = group.value as? NSDictionary

        if let messages = groupss!["messages"] as? [String: Any] {

        }
    }            
    handler(groupMessages)
}

Однако я не смог получить доступ к контенту, потому чтообъекта сообщений создается случайными идентификаторами (например, LC9Pj9krCB4kZnXtXc8), как я могу получить этот контент и senderId?

1 Ответ

0 голосов
/ 11 мая 2018

Во-первых, никогда не используйте 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, чтобы приложение могло получать уведомления при получении нового сообщения..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...