Compare commits

..

2 Commits

Author SHA1 Message Date
c2768a4864 clear cache - refactor to use version numbers
Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
2025-02-06 14:02:30 -06:00
4270b609ed updated with Cache for employees
Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
2025-02-06 14:02:15 -06:00
3 changed files with 80 additions and 1 deletions

View File

@ -25,6 +25,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
let navigationController = UINavigationController(rootViewController: employeeListVC)
window.rootViewController = navigationController
let appVersion = 1.5// get app version
let currentVersion = 1.0 //cached version
if appVersion != currentVersion {
EmployeeCacheService.shared.clear()
}
// Set the window to the scene
self.window = window
window.makeKeyAndVisible()

View File

@ -0,0 +1,44 @@
//
// EmployeeCacheService.swift
// EmployeeDirectory
//
// Created by Matt Bruce on 2/6/25.
//
import Foundation
import UIKit
/// A service that handles image caching using memory, disk, and network in priority order.
public class EmployeeCacheService {
// MARK: - Properties
public static let shared = EmployeeCacheService() // Default shared instance
/// Memory cache for storing images in RAM.
private let emplyoees: Employees? = nil
/// File manager for handling disk operations.
private let fileManager = FileManager.default
/// Directory where cached images are stored on disk.
private let cacheDirectory: URL = {
FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
}()
// MARK: - Initializer
public init() {}
public func save(from employees: Employees) throws {
let data = try JSONEncoder().encode(employees)
try data.write(to: cacheDirectory.appendingPathComponent("employees.json"))
}
public func load() throws -> Employees {
let data = try Data(contentsOf: cacheDirectory.appendingPathComponent("employees.json"))
return try JSONDecoder().decode(Employees.self, from: data)
}
public func clear() {
try? FileManager.default.removeItem(at: cacheDirectory.appendingPathComponent("employees.json"))
}
}

View File

@ -36,8 +36,14 @@ internal enum EmployeeServiceMode: String, CaseIterable {
}
}
/// Service Layer for Employees
public class EmployeeService: EmployeeServiceProtocol {
public enum EmployeeServiceError: Error {
case error
//case LoadError
//case other(Error)
}
// MARK: - Properties
public static let shared = EmployeeService() // Default shared instance
@ -51,7 +57,29 @@ public class EmployeeService: EmployeeServiceProtocol {
/// - Parameter serviceMode: Mode in which to hit.
/// - Returns: An Employees struct
public func getEmployees() async throws -> Employees {
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.production.endpoint, as: Employees.self)
var employees: Employees
let cache = EmployeeCacheService.shared
do {
employees = try cache.load()
return employees
} catch {
if let networkFound = try? await fetchNetworkEmployees() {
employees = networkFound
return employees
}
}
throw EmployeeServiceError.error
}
public func fetchNetworkEmployees() async throws -> Employees {
var employees: Employees
if let networkFound = try? await NetworkService.shared.fetchData(from: EmployeeServiceMode.production.endpoint, as: Employees.self) {
employees = networkFound
try? EmployeeCacheService.shared.save(from: employees)
return employees
} else {
throw EmployeeServiceError.error
}
}
}