swift - 在展开可选值时意外发现 nil(firebase,swift)

标签 swift firebase google-cloud-firestore

我想从firebase获取teamID,但是会出现上面的错误。 这是用户首次注册时发生的情况(注册⇨登录设置)。 第二次或以后登录时,可以从firebase获取team 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: "")]
    }
}

关于swift - 在展开可选值时意外发现 nil(firebase,swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52775402/

相关文章:

ios - 将 Stripe token 推送到 Cloud Function Firebase (iOS Swift 3)

ios - 我收到 message = "ADMIN_ONLY_OPERATION"的运行时错误;使用以下代码时

ios - 禁用编辑文本字段

ios - segue PFObject 无法识别的选择器

ios - 使用 iOS 应用程序开发 Realm ,有没有办法以 GUI 的形式查看数据库?

ios - View Controller 之间的过渡方向

Firebase匿名登录问题

javascript - 在 forEach 中调用 firebase 会使迭代不起作用

javascript - Firestore 网络代码示例给出了无效的参数类型

java - Firebase,从所有文档中获取数组列表字段