【问题标题】:Firebase nested parsing SwiftFirebase 嵌套解析 Swift
【发布时间】:2018-10-21 15:44:05
【问题描述】:

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

【问题讨论】:

    标签: ios json swift firebase firebase-realtime-database


    【解决方案1】:

    第一件事永远不要在Swift 中使用NSDictionaryNSArray,这会使事情变得复杂。其次,只需检查snapshot.exists() 而不是为allObjects 放置guard

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

    输出:所有消息

    [["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 -&gt; GroupId -&gt; messages ref 获取数据并为此 ref 设置一个侦听器,以便在收到新消息时通知应用程序.

    【讨论】:

    • 感谢它的魅力。实际上,我需要获取特定用户发送的所有消息,这就是我遍历所有组的原因,但我也牢记您的建议。最后,如何从该数组中获取 senderId?
    • @AtalayAsa 我已经编辑了答案。如果您需要所有组,请创建一个全局变量并将array 附加到该对象中。
    • 它给了我一个错误,例如 Type 'Any' has no subscript members in the mapping function.
    • 在哪里? let array = Array(messages.values) 是你使用的数组吗?
    • 是的,它是数组let array = Array(messages.values),但错误出现在array.map({$0["senderId"]!}) 行中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2017-03-11
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多