From 4e59fa6f6a381ff5bf3a4d35299828611e5c6f32 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 22 Jan 2025 14:09:09 -0600 Subject: [PATCH] fixed issues in refresh Signed-off-by: Matt Bruce --- .../ViewControllers/EmployeesViewController.swift | 11 ++++++----- EmployeeDirectory/ViewModels/EmployeesViewModel.swift | 4 +++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift index 3ccf1c6..4087933 100644 --- a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift +++ b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift @@ -139,12 +139,13 @@ class EmployeesViewController: UIViewController { viewModel.$isLoading .receive(on: RunLoop.main) .sink { [weak self] isLoading in + guard let self, let refreshControl = self.tableView.refreshControl else { return } if isLoading { - self?.activityIndicator.startAnimating() + activityIndicator.startAnimating() } else { - self?.activityIndicator.stopAnimating() - self?.tableView.refreshControl?.endRefreshing() - self?.updateFooter() + activityIndicator.stopAnimating() + refreshControl.endRefreshing() + updateFooter() } } .store(in: &cancellables) @@ -182,7 +183,7 @@ class EmployeesViewController: UIViewController { var footerMessage: String? // Check for error messages or empty state first - if let message = viewModel.errorMessage ?? (viewModel.employees.isEmpty && !viewModel.isLoading ? "No employees found, please try to refresh." : nil) { + if let message = viewModel.errorMessage ?? (viewModel.employees.isEmpty && viewModel.isLoading == false ? "No employees found, please try to refresh." : nil) { footerMessage = message } diff --git a/EmployeeDirectory/ViewModels/EmployeesViewModel.swift b/EmployeeDirectory/ViewModels/EmployeesViewModel.swift index 8cffd2f..38024c7 100644 --- a/EmployeeDirectory/ViewModels/EmployeesViewModel.swift +++ b/EmployeeDirectory/ViewModels/EmployeesViewModel.swift @@ -46,10 +46,11 @@ public class EmployeesViewModel: ObservableObject { /// Fetch employees for the given page public func fetchEmployees(page: Int = 1) { + // Prevent duplicate calls guard !isLoading else { return } + errorMessage = nil isLoading = true - Task { do { // Fetch employees using the paginated API @@ -68,6 +69,7 @@ public class EmployeesViewModel: ObservableObject { } else { employees.append(contentsOf: wrapper.employees) // Append for subsequent pages } + } catch { // Handle errors errorMessage = "An unexpected error occurred, please try to refresh."