Возникли проблемы при заполнении tableView с использованием Firebase / Firestore в iOS - PullRequest
0 голосов
/ 26 апреля 2020

Это мой первый опыт работы с облачной базой данных, и я ищу здесь небольшое руководство, поскольку я относительно новичок в программировании и, в частности, в Firestore.

Я пытаюсь get() все данные моего документа внутри моего viewDidLoad и сохраните его внутри словаря, чтобы я мог использовать его позже в методах tableView dataSource для заполнения моих tableView разделов и строк.

Я работаю над приложением для журнала тренировок / тренировок и ввел некоторые фиктивные данные для коллекций дней и тренировок, поэтому мой словарь распечатывается следующим образом ...

dataDict = ["Monday": ["Chest", "Arms"], "Wednsday": ["Legs", "Arms"], "Tuesday": ["Back"]]

Но я У меня проблемы с использованием этих данных для заполнения полей, потому что если я пытаюсь распечатать результаты dataDict вне функции dateWorkoutRequest, как внутри моих методов dataSource, я получу пустой словарь. Мой tableView.reloadData() не в том месте? Должен ли я использовать словарь для анализа моих данных или это плохая идея?

Вот моя структура данных и соответствующий код ...

/users/mi9P3TrLwkQejYo3oDIu/Days/WZ3Q6LDuu1kja5Rc/Workouts/BpLGFREoJNzNQW

enter image description here

enter image description here

var daysArray = [String]()
var dayIdArray = [String]()
var dataDict : [String:[String]] = [:]

//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.colRef = Firestore.firestore().collection("/users/\(self.userIdRef)/Days")

        self.dateWorkoutRequest()
    }
}

func dateWorkoutRequest(){
    self.colRef.getDocuments { (snapshot, err) in
        if let err = err
        {
            print("Error getting documents: \(err)");
        }
        else {
            //Appending all Days collection documents with a field of "dow" to daysarray...
            for dayDocument in snapshot!.documents {
                self.daysArray.append(dayDocument.data()["dow"] as? String ?? "")
                self.dayIdArray.append(dayDocument.documentID)

                Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(dayDocument.documentID)/Workouts/").getDocuments { (snapshot, err) in
                    if let err = err
                    {
                        print("Error getting documents: \(err)");
                    }
                    else {
                        //Assigning all Workouts collection documents belonging to selected \(dayDocument.documentID) to dictionary dataDict...
                        for document in snapshot!.documents {

                            if self.dataDict[dayDocument.data()["dow"] as? String ?? ""] == nil {
                                self.dataDict[dayDocument.data()["dow"] as? String ?? ""] = [document.data()["workout"] as? String ?? ""]
                            } else {
                                self.dataDict[dayDocument.data()["dow"] as? String ?? ""]?.append(document.data()["workout"] as? String ?? "")
                            }
                            print(self.dataDict)
                        }
                    }
                }
            }
            self.dayCount =  snapshot?.count ?? 0
            self.tableView.reloadData()
        }
    }
}

1 Ответ

1 голос
/ 26 апреля 2020

Я бы попытался поместить self.tableView.reloadData () сразу после строки, в которую вы добавляете документ в массив.

Я думаю, что вам интересно, что вы поставили DispatchQueue.main.asyn c block в reloadData тоже.

Вот так:

func dateWorkoutRequest(){
            self.colRef.getDocuments { (snapshot, err) in
                if let err = err
                {
                    print("Error getting documents: \(err)");
                }
                else {
                    //Appending all Days collection documents with a field of "dow" to daysarray...
                    for dayDocument in snapshot!.documents {
                        self.daysArray.append(dayDocument.data()["dow"] as? String ?? "")
                        self.dayIdArray.append(dayDocument.documentID)

                        Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(dayDocument.documentID)/Workouts/").getDocuments { (snapshot, err) in
                            if let err = err
                            {
                                print("Error getting documents: \(err)");
                            }
                            else {
                                //Assigning all Workouts collection documents belonging to selected \(dayDocument.documentID) to dictionary dataDict...
                                for document in snapshot!.documents {

                                    if self.dataDict[dayDocument.data()["dow"] as? String ?? ""] == nil {
                                        self.dataDict[dayDocument.data()["dow"] as? String ?? ""] = [document.data()["workout"] as? String ?? ""]
                                    } else {
                                        self.dataDict[dayDocument.data()["dow"] as? String ?? ""]?.append(document.data()["workout"] as? String ?? "")
                                    }
                                    DispatchQueue.main.async {
                                       self.tableView.reloadData()
                                    }
                                }
                            }
                        }
                    }
                    self.dayCount =  snapshot?.count ?? 0

                }
            }
        }
...