因此,当我第一次加载我的应用程序并添加我的第一条数据时,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)
}
})
}