Неожиданно обнаружен ноль при развертывании необязательного значения (firebase, swift) - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы получить teamID из firebase, но вышеописанная ошибка произойдет.Это то, что происходит, когда пользователь впервые регистрируется (регистрация ⇨ логин установлен).При входе во второй раз или позже вы можете получить идентификатор команды из Firebase.Я не знаю, почему это происходит при первой регистрации.Не могли бы вы сказать мне, как это решить?

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: "")]
        }
    }

1 Ответ

0 голосов
/ 12 октября 2018

Я считаю, что проблема, с которой вы столкнулись, заключается в том, что вы принудительно распаковываете данные внутри вашего документа3, а также свой 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: "")]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...