'How to optimize loading from Firestore to Tableview

My View Controller has a Tableview with 2 segments. Depending on which Segment is selected, the Tableview displays a different set of data.

@IBAction func didChangeSegment(_ sender: UISegmentedControl) {
        if sender.selectedSegmentIndex == 0 {
            model.getRecipes(starredTrue: false)
        }
        else if sender.selectedSegmentIndex == 1 {
            model.getRecipes(userAdded: true)
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return recipe.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "MealPlanCell", for: indexPath) as! MealPlanCell
        
        let recipeInTable = recipe[indexPath.row]
        
        cell.displayRecipe(recipe: recipeInTable, indexPathRow: indexPath.row)
        
        return cell
    }

And this is how model.getRecipes() gets data from Firestore before returning it to the Tableview:

        let recipeQuery = db.collection("recipes")
        
        let docRef = recipeQuery.document(documentId)
        
        docRef.getDocument { document, error in
            if let error = error as NSError? {
                self.errorMessage = "Error getting document: \(error.localizedDescription)"
            }
            else {
                if let document = document {
                    do {
                        self.recipe = try document.data(as: Recipe.self)
                        
                        let recipeFromFirestore = Recipe(
                            id: documentId,
                            title: self.recipe!.title ?? "")
                        
                        self.recipes.append(recipeFromFirestore)
                    }
                    catch {
                    }
                }
                DispatchQueue.main.async {
                    self.delegateRecipes?.recipesRetrieved(recipes: self.recipes)
                }
            }
        }

The issue I'm having is that the Tableview takes a very long time to display data. It appears this is because it has to wait for the model to finish loading all the data from Firestore every time I select one of the segments.

How can I optimize this process? Is it possible to have the TableView load/display cell by cell, instead of needing to wait for all data to be loaded?

Any guidance is much appreciated!



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source