在将数据发送到Firebase之前,我确保值确实存在。在我的应用中,我从Firebase数据库中提取这些数据。Firebase 检索该数据时是否有可能出错,并且返回 nil 而不是实际数据?
基本上Firebase可以损坏有效数据并以nil值的形式返回吗?
nameRef?.observeSingleEvent(of: .value, with: {
(snapshot) in
if let dict = snapshot.value as? [String:Any]{
//100% these have valid data
//but if either of these get corrupted and returned as nil there will be a crash
let firstName = dict["firstName"] as? String
let lastName = dict["lastName"] as? String
self.firstNameLabel.text! = firstName!
self.lastNameLabel.text! = lastName!
}
}
我知道我可以使用if let
来防止崩溃,但我想知道它是否有必要?我有更多的数据被拉出,然后是名字和姓氏,我将不得不到处使用if let
。尽管这是安全的做法,但它在我的应用程序中添加了大量代码。如果没有必要,我不会使用它。
if let firstName = firstName{....
if let lastName = lastName{....
这是我第一次构建应用程序,我以前从未与团队合作过,所以我不知道这样的问题的答案。
不,当您从 Firebase 检索值时,当值不在缓存中时,您可以确保从数据库中正确获取这些值。我在这里看到的一个常见错误是它们在 appDelegate 中具有持久性,并且它们在捕获单个事件之前不会同步数据库,就像您所做的那样。当使用childAdded,childRemoved等时,数据库始终处于同步状态,因此您不必调用keepSynched/关闭持久性。
下面的代码看起来更干净、更安全、更易于理解。我刚刚添加了默认值。
nameRef?.observeSingleEvent(of: .value, with: {
(snapshot) in
let values = snapshot.value as? NSDictionary
self.firstNameLabel.text! = dict["firstName"] as? String ?? "No first name given"
self.lastNameLabel.text! = dict["lastName"] as? String ?? "No last name given"
}
如果你在应用委托中有持久性,请调用 nameRef?。keepSynced(true( 在使用 observeSingleEvent 捕获数据之前。不调用它可能会导致奇怪的快照值,例如:如何使用 Swift 从 Firebase 检索数据?