swift - 在展开可选值时意外发现 nil (firebase, swift)
问题描述
我想从firebase获取teamID,但是会出现上述错误。这是用户首次注册时发生的情况(注册⇨登录设置)。第二次或以后登录时,您可以从 firebase 获取团队 ID。我不知道为什么它会在第一次注册时发生。你能告诉我如何解决吗?
override func viewDidLoad() {
super.viewDidLoad()
circleButton = Circle()
if arr != nil {
self.arr = []
self.dataNameFromFireStore = [Any]()
self.dataTimeFromFirestore = [Any]()
self.dataTitleFromFireStore = [Any]()
self.submitDocumentIdArr = [Any]()
self.selectedNum = 1
userTable.delegate = self
userTable.dataSource = self
userTable.register(UINib(nibName: "userTableViewCell", bundle: nil), forCellReuseIdentifier: "cellName")
self.db.collection("users").document(self.fireAuthUID).addSnapshotListener { (snapshot3, error) in
guard let document3 = snapshot3 else {
print("erorr2 \(String(describing: error))")
return
}
let data = document3.data()
self.teamIDFromFirebase = (data!["teamID"] as? String)! ← An error occurred here!!!!!!!!!!
self.db.collection("diary").document(self.teamIDFromFirebase).collection("diaries").whereField("submit", isEqualTo: true).getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
var i = 0
for document in querySnapshot!.documents {
self.timelineDocumentIdArr.append(document.documentID)
let documentData = document.data()
self.dataTitleFromFireStore.append((documentData["今日のタイトル"] as? String)!)
self.dataTimeFromFirestore.append((documentData["time"] as? String)!)
self.dataNameFromFireStore.append((documentData["userName"] as? String)!)
self.arr.append(CellData(image: UIImage(named: "weight")!, name: self.dataNameFromFireStore[i] as! String, time: self.dataTimeFromFirestore[i] as! String, title: self.dataTitleFromFireStore[i] as! String))
print(self.arr)
i += 1
}
self.userTable.reloadData()
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
print(self.timelineDocumentIdArr)
}
}
}
} else {
return arr = [CellData(image: UIImage(named: "")!, name: "", time: "", title: "")]
}
}
解决方案
我相信您遇到的问题是您强制解开 document3 和 querySnapshot 中的数据。因此,当没有数据时,您的应用程序将崩溃...请尝试以下代码,并让我知道它是否有效!
override func viewDidLoad() {
super.viewDidLoad()
circleButton = Circle()
if arr != nil {
self.arr = []
self.dataNameFromFireStore = [Any]()
self.dataTimeFromFirestore = [Any]()
self.dataTitleFromFireStore = [Any]()
self.submitDocumentIdArr = [Any]()
self.selectedNum = 1
userTable.delegate = self
userTable.dataSource = self
userTable.register(UINib(nibName: "userTableViewCell", bundle: nil), forCellReuseIdentifier: "cellName")
self.db.collection("users").document(self.fireAuthUID).addSnapshotListener { (snapshot3, error) in
guard let document3 = snapshot3 else {
print("erorr2 \(String(describing: error))")
return
}
guard let data = document3.data() else { return }
self.teamIDFromFirebase = data["teamID"] as? String ?? ""
self.db.collection("diary").document(self.teamIDFromFirebase).collection("diaries").whereField("submit", isEqualTo: true).getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
var i = 0
guard let querySnapshot = querySnapshot else { return }
for document in querySnapshot.documents {
self.timelineDocumentIdArr.append(document.documentID)
let documentData = document.data()
self.dataTitleFromFireStore.append(documentData["今日のタイトル"] as? String ?? "")
self.dataTimeFromFirestore.append(documentData["time"] as? String ?? "")
self.dataNameFromFireStore.append(documentData["userName"] as? String ?? "")
self.arr.append(CellData(image: UIImage(named: "weight")!, name: self.dataNameFromFireStore[i] as? String ?? "", time: self.dataTimeFromFirestore[i] as? String ?? "", title: self.dataTitleFromFireStore[i] as? String ?? ""))
print(self.arr)
i += 1
}
self.userTable.reloadData()
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
print(self.timelineDocumentIdArr)
}
}
}
} else {
return arr = [CellData(image: UIImage(named: "")!, name: "", time: "", title: "")]
}
}
推荐阅读
- r - 在同一数据框中收集两次
- android - ImageView 的动画以半圆移动(Android)
- kdb - kdb: guid encoding in c results in invalid serialization
- amazon-cognito - Cognito 无法注册已处于未确认状态的用户
- schema.org - Schema.org 用于列出文章的类别页面
- python-3.x - 使用元类时 __new__ 的虚假参数
- javascript - How can I change these arrow functions to regular functions to support IE?
- firebase - firebase serve TypeError:需要全局模式字符串
- javascript - 如果条件不满足如何创建新数组?
- c# - 更新和删除缓存条目时 MemoryCache 的并发问题