0

因此,当我第一次加载我的应用程序并添加我的第一条数据时,tableView 重新加载并且部分/行被正确添加,但是当我在那之后输入任何其他数据时,新的数据被添加,但我的原始数据在我的 tableView 中(而不是在后端)中重复,此外,如果我在同一部分下添加数据,我的应用程序崩溃并且我收到标题中的错误。

希望对此有所了解。这是我的第一个 Firestore 应用程序,我仍在努力解决。

编辑1:我尝试删除两个快照侦听器并解决了我的错误问题,但我的数据仍然重复......

编辑2:没关系。我想到了。我将 dataArray 作为一个全局变量,一直附加到它。

在此处输入图像描述 在此处输入图像描述

struct Workouts: Decodable {
    var workout : String     
  }

struct Days: Decodable {
     var dow : String
    var workouts : [Workouts] 
  }



var dayCount = 0

var dataArray = [Days]()


    //MARK: - viewDidLoad()
    override func viewDidLoad() {
        super.viewDidLoad()

        vcBackgroundImg()
        navConAcc()

        picker.delegate = self
        picker.dataSource = self

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)
        tableView.tableFooterView = UIView()

        Auth.auth().addStateDidChangeListener { (auth, user) in
            self.userIdRef = user!.uid
            self.rootCollection = Firestore.firestore().collection("/users/\(self.userIdRef)/Days")

            self.loadData { (Bool) in
                if Bool == true {
                    self.dayCount = self.dataArray.count
                    self.tableView.reloadData()
                }
            }

        }

    }



    //MARK: - Load Data
    func loadData(completion: @escaping (Bool) -> ()){

        let group = DispatchGroup()

        self.rootCollection.addSnapshotListener ({ (snapshot, err) in

            if let err = err
            {
                print("Error getting documents: \(err.localizedDescription)");
            }
            else {

                guard let dayDocument = snapshot?.documents else { return }

                for day in dayDocument {

                    group.enter()

                    self.rootCollection.document(day.documentID).collection("Workouts").addSnapshotListener{(snapshot, err) in

                        var workouts = [Workouts]()

                        let workoutDocument = snapshot!.documents

                        try! workoutDocument.forEach({doc in

                            let tester: Workouts = try doc.decoded()
                            let workoutString = tester.workout
                            let newWorkout = Workouts(workout: workoutString)
                            workouts.append(newWorkout)
                        })

                        let dayTitle = day.data()["dow"] as! String

                        let newDay = Days(dow: dayTitle, workouts: workouts)

                        self.dataArray.append(newDay)

                        group.leave()
                    }

                }

            }
            group.notify(queue: .main){
                completion(true)
            }
        })
    }
4

0 回答 0