🧑‍💻 🔥 Decouple Data/UnitsStore

pull/8/head
Alexis Drai 2 years ago
parent 0858bd0a90
commit ce61496b5b

@ -117,7 +117,6 @@
EC8BAD142A34650D0062226B /* Data */ = {
isa = PBXGroup;
children = (
EC242B822A1FAA9B006FE760 /* Stub.swift */,
EC8BAD152A3465230062226B /* UnitsStore.swift */,
);
path = Data;
@ -184,6 +183,7 @@
ECE6E3C02A1F80F6004FE471 /* Model */ = {
isa = PBXGroup;
children = (
EC242B822A1FAA9B006FE760 /* Stub.swift */,
EC242B6B2A1F81AE006FE760 /* Subject.swift */,
EC242B692A1F8189006FE760 /* Unit.swift */,
EC242B6D2A1F81CC006FE760 /* UnitsManager.swift */,

@ -9,41 +9,35 @@ import SwiftUI
class UnitsStore: ObservableObject {
var units: [Unit] = []
private static func fileURL() throws -> URL {
try FileManager.default.url(
for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false
).appendingPathComponent("units.data")
).appendingPathComponent("my.data")
}
func load() async throws -> [Unit] {
let task = Task<[Unit], Error> {
func load<T: Codable>(defaultValue: [T]) async throws -> [T] {
let task = Task<[T], Error> {
let fileURL = try Self.fileURL()
let data = try? Data(contentsOf: fileURL)
var units: [Unit] = []
if (data == nil || data!.isEmpty) {
units = Stub.units
}
else if (data != nil) {
units = try JSONDecoder().decode([Unit].self, from: data!)
var elements: [T] = defaultValue
if let validData = data, !validData.isEmpty {
elements = try JSONDecoder().decode([T].self, from: validData)
}
return units
return elements
}
self.units = try await task.value
return self.units
return try await task.value
}
func save(units: [Unit]) async throws {
func save<T: Codable>(elements: [T]) async throws {
let task = Task {
let data = try JSONEncoder().encode(units)
let data = try JSONEncoder().encode(elements)
let outfile = try Self.fileURL()
try data.write(to: outfile)
}

@ -19,7 +19,7 @@ struct UnitsManager {
mutating func load() async throws {
do {
self.units = try await store.load()
self.units = try await store.load(defaultValue: Stub.units)
} catch {
// DEV: this should be replaced with proper error handling before ever going to prod
print("ERROR: Failed to load...")
@ -28,7 +28,7 @@ struct UnitsManager {
func save() async throws {
do {
try await store.save(units: units)
try await store.save(elements: units)
} catch {
// DEV: this should be replaced with proper error handling before ever going to prod
print("ERROR: Failed to save...")

Loading…
Cancel
Save