Firebase查询快照为零? [英] Firebase Query snapshot nil?

查看:144
本文介绍了Firebase查询快照为零?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个简单的聊天应用来学习Swift和Firebase。我有一个查询,检查聊天室的消息加载到一个tableView。查询返回一个快照,但是我无法正确地存储和加载数据。我从快照创建了一个字典,所以我可以得到个别的子值,但他们返回零:



$ p $ query.observeSingleEvent(of :.childAdded,其中:{快照在

打印(快照)

index indexs = self.messages.enumerated()。map {
IndexPath(row: $ 0.0,部分:0)
}

guard let messagesDict = snapshot.value as?[String:AnyObject] else {return}
guard let sender = messagesDict [sender ] as?String else {return}
guard let text = messagesDict [text] as?String else {return}
guard timestamp = messagesDict [timestamp] as?Int else {return}

让message = Message.init(key:snapshot.key,sender:sender as!String,text:text as!String,timestamp:timestamp)

self.messages .append(消息)

self.tableView.reloadData()
})

po messagesDict 断点:$ b​​
$ b

 ▿1元素
▿0:2元素
- 键值:-KotqLUUucaRagTRt967
▿value:3元素
▿0:2元素
- key:发送者
- 值:eGTYRSo81JefgasYLRHUFHUTnEC3
▿1:2元素
- key:text
- value:测试
▿2:2元素
- key:时间戳
- 值:1499914135546

应用程序到达下一个断点,我设置 guard让sender ,但是应用程序点击返回并停止执行其余的代码块。如何正确访问发件人,文本和时间戳记元素,所以我可以将它们设置为变量,并将它们存储在我的表的数组?

任何帮助将不胜感激。我一直坚持这一段时间,我可以用另一双眼睛!



谢谢!!



<其他信息:



查询 b
let query = rootRef.child(chat-messages / \(chatKey))



数据库结构

  {
chat-messages: {
-KotqKI4zF9cS5XMR9WU:{
-KotqLUUucaRagTRt967:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
时间戳:1499914135546
}
},
-KotqvBoFFzOTY6Q1fO7:{
-KotqwGAJ85NuAp-Lh3Z:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914290279
}
},
-KotsNgF0ou5MIDn2l5K:{
-KotsOSXw7OS_3xuXZgP: {
发件人:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914671997
},
-KotsPqrCpipMLulNNFl:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test44,
timestamp:1499914677715
}
},
-Kotsv1Vv19dEF2q7XQu:{
-KotsvYO9JvLY8gdTnA0:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914811675
},
-KotsvxKXzIwbyvbwLPp:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914813335
},
-Kotsw9vLiEf6KquU__e:{
发件人:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914814205
},
-KotswHnzmfkEXih1O7y:{
sender :eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499914814 709
}
-KotszHKBt254jZnUMAl:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test46456,
timestamp:1499914826967


-KoyheS01YxWExSNxl_H:{
-Koyhf3G-FPEDrxQOcpU:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499995746607
}
},
-Koyjc_aBaF1kFE-8Bll:{
-Koyjd9PnO6sPOhS7P27:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499996263096
},
-KoyjdzSEi5twTVQMGOu:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499996266491
},
-Koyje2C9E524kV7nhLY:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1499996266730
$ b $ -b
$ -b
$发件人:$ e $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $'$' :1500746948396

-KpfUHQGuTDi4yZutS5K:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp: 1500746950368

-KpfUHdSXeTzauATsDAP:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:test,
timestamp:1500746951277
},
-Kpfia0fXsoqpRtIr1kU:{
sender:eGTYRSo81JefgasYLRHUFHUTnEC3,
text:gerg,
timestamp:1500750962815
$ b $,
聊天参与者:{
-KotqKI4zF9cS5XMR9WU:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester

},
-KotqvBoFFzOTY6Q1fO7:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester
$ b $,
-KotsNgF0ou5MIDn2l5K:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester
}
},
-Kotsv1Vv19dEF2q7XQu:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester
}
},
-KoyheS01YxWExSNxl_H: {
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester
}
},
-Koyjc_aBaF1kFE-8Bll:{
eGTYRSo81JefgasYLRHUFHUTnEC3 :{
username:tester
}
},
-KpfLBjQdPiX2kSrl1yF:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username :tester
}
}
},
chats:{
-KotqKI4zF9cS5XMR9WU:{
currentName:test ,
date:1499914130657
},
-KotqvBoFFzOTY6Q1fO7:{
currentName:test,
date:1499914285904
},
-KotsNgF0ou5MIDn2l5K:{
currentName:test,
date:1499914668844
},
-Kotsv1Vv19dEF2q7XQu:{
currentName :test,
date:1499914809570
},
-KoyheS01YxWExSNxl_H:{
currentName:test,
date: 1499995744095

-Koyjc_aBaF1kFE-8Bll:{
currentName:test,
date:1499996260740
},
-KpfLBjQdPiX2kSrl1yF:{
currentName:test3222,
date:1500744567786
}
},
user-chats:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
-KotqKI4zF9cS5XMR9WU:{
chatKey:-KotqKI4zF9cS5XMR9WU,
currentName:test
},
-KotqvBoFFzOTY6Q1fO7:{
chatKey:-KotqvBoFFzOTY6Q1fO7,
currentName:test
},
-KotsNgF0ou5MIDn2l5K:{
chatKey: - KotsNgF0ou5MIDn2l5K,
currentName:test
},
-Kotsv1Vv19dEF2q7XQu:{
chatKey:-Kotsv1Vv19dEF2q7XQu,
currentName :test
},
-KoyheS01YxWExSNxl_H:{
chatKey:-KoyheS01YxWExSNxl_H,
currentName:test
},
-Koyjc_aBaF1kFE-8Bll:{
chatKey:-Koyjc_aBaF1kFE-8Bll,
currentName:test
},
- KpfLBjQdPiX2kSrl1yF:{
chatKey:-KpfLBjQdPiX2kSrl1yF,
currentName:test3222
}
}
},
user -friends:{
36HDn5XyxjMCcMluJJ9KPBOCDMm1:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
username:tester
}
},
eGTYRSo81JefgasYLRHUFHUTnEC3:{
36HDn5XyxjMCcMluJJ9KPBOCDMm1:{
username:tester2
}
}
},
用户邀请:{
eGTYRSo81JefgasYLRHUFHUTnEC3:{
36HDn5XyxjMCcMluJJ9KPBOCDMm1:{
username:tester2
}
}
},
users:{
36HDn5XyxjMCcMluJJ9KPBOCDMm1:{
email:tester2@test.com,
username:tester2
},
eGTYRSo81JefgasYLRHUFHUTnEC3:{
email:test@test.com,
username:tester
}
}
}


解决方案

我不认为您需要ChildAdded处理程序,我去了一个observeSingleEvent例子,因为你想在没有触发器的情况下从数据库查询数据。当您使用observeSingleEvent时,保持数据库同步非常重要。我建议使用下面的代码:

$ p $ query.keepSynched(true)//保持数据与数据库同步,如果你有数据在你的appDelegate
query.observeSingleEvent(:.value,具有:{(snapshot)in //在这里更改
print(snapshot)
// // // //因为你想循环再次,因为可能有多个
在该聊天室中的消息,所有这些都有一个唯一的ID,做这个循环:
let enumerator = snapshot.children
while let rest = enumerator.nextObject( )as?FIRDataSnapshot {
//这里是单个消息
let values = rest.value as?NSDictionary
(key,value)in values {
print( Key:\(key),value:\(value))
}
//可以说你想检查一个名为text的键值是否为
让textUser = values?[text]为?S tring? 找不到文本
//如果没有文本,则提供默认值。你可以把它留空,比它是零(不推荐)
//这不仅是更多的可读性,我不使用强制解包,所以你的应用程序
//不能导致异常。

//从字典中获得更多值,就像我用textUser
// //初始化消息比这里一样。你会看到你不需要强制解开任何东西:D



$)
$ / code> pre>

I'm creating a simple chat app to learn Swift and Firebase. I have a query that checks for a chat room's messages to load into a tableView. The query returns a snapshot but I'm having trouble getting the data to store and load it properly. I created a dictionary from the snapshot so I can get the individual child values but they are returning nil:

query.observeSingleEvent(of: .childAdded, with: { snapshot in

            print(snapshot)

            let indexPaths = self.messages.enumerated().map {
                IndexPath(row: $0.0, section: 0)
            }

            guard let messagesDict = snapshot.value as? [String:AnyObject] else { return }
            guard let sender = messagesDict["sender"] as? String else { return }
            guard let text = messagesDict["text"] as? String else { return }
            guard let timestamp = messagesDict["timestamp"] as? Int else { return }

            let message = Message.init(key: snapshot.key, sender: sender as! String, text: text as! String, timestamp: timestamp)

            self.messages.append(message)

            self.tableView.reloadData()
        })

po messagesDict returns data at the breakpoint:

▿ 1 element
  ▿ 0 : 2 elements
    - key : "-KotqLUUucaRagTRt967"
    ▿ value : 3 elements
      ▿ 0 : 2 elements
        - key : sender
        - value : eGTYRSo81JefgasYLRHUFHUTnEC3
      ▿ 1 : 2 elements
        - key : text
        - value : test
      ▿ 2 : 2 elements
        - key : timestamp
        - value : 1499914135546

The app gets to the next breakpoint where I set guard let sender but the app hits return and stops executing the rest of the block of code. How do I properly access sender, text, and timestamp elements so I can set them to variables and store them in the array for my table?

Any help would be greatly appreciated. I've been stuck on this for a while and I could use another pair of eyes!

Thanks!!

Additional info:

Query:

let query = rootRef.child("chat-messages/\(chatKey)")

Database structure:

{
  "chat-messages" : {
    "-KotqKI4zF9cS5XMR9WU" : {
      "-KotqLUUucaRagTRt967" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914135546
      }
    },
    "-KotqvBoFFzOTY6Q1fO7" : {
      "-KotqwGAJ85NuAp-Lh3Z" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914290279
      }
    },
    "-KotsNgF0ou5MIDn2l5K" : {
      "-KotsOSXw7OS_3xuXZgP" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914671997
      },
      "-KotsPqrCpipMLulNNFl" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test44",
        "timestamp" : 1499914677715
      }
    },
    "-Kotsv1Vv19dEF2q7XQu" : {
      "-KotsvYO9JvLY8gdTnA0" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914811675
      },
      "-KotsvxKXzIwbyvbwLPp" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914813335
      },
      "-Kotsw9vLiEf6KquU__e" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914814205
      },
      "-KotswHnzmfkEXih1O7y" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499914814709
      },
      "-KotszHKBt254jZnUMAl" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test46456",
        "timestamp" : 1499914826967
      }
    },
    "-KoyheS01YxWExSNxl_H" : {
      "-Koyhf3G-FPEDrxQOcpU" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499995746607
      }
    },
    "-Koyjc_aBaF1kFE-8Bll" : {
      "-Koyjd9PnO6sPOhS7P27" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499996263096
      },
      "-KoyjdzSEi5twTVQMGOu" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499996266491
      },
      "-Koyje2C9E524kV7nhLY" : {
        "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
        "text" : "test",
        "timestamp" : 1499996266730
      }
    },
    "-KpfUGw45F1FU2IrR87A" : {
      "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
      "text" : "test",
      "timestamp" : 1500746948396
    },
    "-KpfUHQGuTDi4yZutS5K" : {
      "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
      "text" : "test",
      "timestamp" : 1500746950368
    },
    "-KpfUHdSXeTzauATsDAP" : {
      "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
      "text" : "test",
      "timestamp" : 1500746951277
    },
    "-Kpfia0fXsoqpRtIr1kU" : {
      "sender" : "eGTYRSo81JefgasYLRHUFHUTnEC3",
      "text" : "gerg",
      "timestamp" : 1500750962815
    }
  },
  "chat-participants" : {
    "-KotqKI4zF9cS5XMR9WU" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-KotqvBoFFzOTY6Q1fO7" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-KotsNgF0ou5MIDn2l5K" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-Kotsv1Vv19dEF2q7XQu" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-KoyheS01YxWExSNxl_H" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-Koyjc_aBaF1kFE-8Bll" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "-KpfLBjQdPiX2kSrl1yF" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    }
  },
  "chats" : {
    "-KotqKI4zF9cS5XMR9WU" : {
      "currentName" : "test",
      "date" : 1499914130657
    },
    "-KotqvBoFFzOTY6Q1fO7" : {
      "currentName" : "test",
      "date" : 1499914285904
    },
    "-KotsNgF0ou5MIDn2l5K" : {
      "currentName" : "test",
      "date" : 1499914668844
    },
    "-Kotsv1Vv19dEF2q7XQu" : {
      "currentName" : "test",
      "date" : 1499914809570
    },
    "-KoyheS01YxWExSNxl_H" : {
      "currentName" : "test",
      "date" : 1499995744095
    },
    "-Koyjc_aBaF1kFE-8Bll" : {
      "currentName" : "test",
      "date" : 1499996260740
    },
    "-KpfLBjQdPiX2kSrl1yF" : {
      "currentName" : "test3222",
      "date" : 1500744567786
    }
  },
  "user-chats" : {
    "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
      "-KotqKI4zF9cS5XMR9WU" : {
        "chatKey" : "-KotqKI4zF9cS5XMR9WU",
        "currentName" : "test"
      },
      "-KotqvBoFFzOTY6Q1fO7" : {
        "chatKey" : "-KotqvBoFFzOTY6Q1fO7",
        "currentName" : "test"
      },
      "-KotsNgF0ou5MIDn2l5K" : {
        "chatKey" : "-KotsNgF0ou5MIDn2l5K",
        "currentName" : "test"
      },
      "-Kotsv1Vv19dEF2q7XQu" : {
        "chatKey" : "-Kotsv1Vv19dEF2q7XQu",
        "currentName" : "test"
      },
      "-KoyheS01YxWExSNxl_H" : {
        "chatKey" : "-KoyheS01YxWExSNxl_H",
        "currentName" : "test"
      },
      "-Koyjc_aBaF1kFE-8Bll" : {
        "chatKey" : "-Koyjc_aBaF1kFE-8Bll",
        "currentName" : "test"
      },
      "-KpfLBjQdPiX2kSrl1yF" : {
        "chatKey" : "-KpfLBjQdPiX2kSrl1yF",
        "currentName" : "test3222"
      }
    }
  },
  "user-friends" : {
    "36HDn5XyxjMCcMluJJ9KPBOCDMm1" : {
      "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
        "username" : "tester"
      }
    },
    "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
      "36HDn5XyxjMCcMluJJ9KPBOCDMm1" : {
        "username" : "tester2"
      }
    }
  },
  "user-invites" : {
    "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
      "36HDn5XyxjMCcMluJJ9KPBOCDMm1" : {
        "username" : "tester2"
      }
    }
  },
  "users" : {
    "36HDn5XyxjMCcMluJJ9KPBOCDMm1" : {
      "email" : "tester2@test.com",
      "username" : "tester2"
    },
    "eGTYRSo81JefgasYLRHUFHUTnEC3" : {
      "email" : "test@test.com",
      "username" : "tester"
    }
  }
}

解决方案

I do not think you want a ChildAdded handler, so I go with a observeSingleEvent example since you want to query data from the database at that time without triggers. When you use a observeSingleEvent, it is important to keep the database in sync. I would recommend using the code below:

query.keepSynched(true) //keeps data in sync with database, if you have data persistince on in your appDelegate
query.observeSingleEvent(of: .value, with: { (snapshot) in //notice the changed here
            print(snapshot)
            //Since you want to loop again because there could be multiple
            //messages in that chatroom which all have a unique ID, do this loop:
            let enumerator = snapshot.children
            while let rest = enumerator.nextObject() as? FIRDataSnapshot {
               //this is 1 single message here
               let values = rest.value as? NSDictionary
               for (key, value) in values{
               print("Key: \(key), value: \(value)") 
               }
               //lets say you want to check if there is a value with a key named "text":
            let textUser = values?["text"] as? String ?? "No text found" 
               //providing a default value if there is no text. You could leave it empty, than it is nil (not recommend)
               //Not only is this a lot more readable, I do not use force unwrapping so your app 
               //cannot cause an exception.

               //Get more values from the dictionary as I did with textUser
               //Initialize message than here. You will see you do not need to force unwrap anything :D
               }

            }

        })

这篇关于Firebase查询快照为零?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆