|
|
|
@ -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)
|
|
|
|
|
}
|
|
|
|
|