Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase嵌套解析_Ios_Json_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios Firebase嵌套解析

Ios Firebase嵌套解析,ios,json,swift,firebase,firebase-realtime-database,Ios,Json,Swift,Firebase,Firebase Realtime Database,我有以下Firebase查询用于解析到我的tableView中 { "-LC8fVE90ovEFRQAhhdv" : { "description" : "Bu grupta arkadaşlar takılsınlar", "members" : [ "VSVmIF4o0ie2QMIcXdTDTcC8Hq93", "hJgM5tYU45VmjaMTzYAG4Yo3RyD2", "YrLEyhWf9KOIwoK2YN7HrzxpwMc2" ], "title" : "

我有以下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)
}

然而,我无法访问内容,因为messages对象是由LC9Pj9krCB4kZnXtXc8等随机标识符创建的。如何获取内容和senderId?

首先,不要在Swift中使用NSDictionary或NSArray,这会使事情变得复杂。其次,只需检查snapshot.exists,而不是为AllObject设置保护

组中的for group应替换为snapshot.children中的for 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)
}
输出:senderIds

输出:uniqueSenderIds

产出:最终产出

产出:最终产出


我不知道你为什么要获取所有组的内容,但我建议你通过组->组ID->消息引用获取数据,并为该引用设置一个侦听器,以便在收到新消息时通知应用程序。

谢谢,它工作得很好。事实上,我需要获取特定用户发送的所有消息,这就是为什么我要遍历所有组,但我也要记住您的建议。最后,如何从该数组中提取senderId?@AtalayAsa我已编辑了答案。如果您需要所有组,请创建一个全局变量并将数组附加到该对象中。它给了我一个错误,如类型“Any”在映射函数中没有下标成员。在哪里?let array=Arraymessages.values是您正在使用的数组吗?是的,它是数组let array=Arraymessages.values,但错误发生在数组.map{$0[senderId]!}行中。
[["content": "Its me", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"],["content": "Who are you", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]]
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2", "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2": ["Its me", "Who are you"]]
["YrLEyhWf9KOIwoK2YN7HrzxpwMc2": [["content": "Its me", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"], ["content": "Who are you", "senderId": "YrLEyhWf9KOIwoK2YN7HrzxpwMc2"]]]