Refactor globals

This commit is contained in:
Christoph Hagen
2023-06-11 21:57:07 +02:00
parent ab64dac7fc
commit f731927dcd
10 changed files with 77 additions and 139 deletions

View File

@ -11,10 +11,15 @@ final class TemperatureStorage: ObservableObject {
in: .userDomainMask,
appropriateFor: nil, create: true)
}
@AppStorage("newestDate")
private var newestMeasurementTime: Int = 0
/**
The date of the latest measurement.
Incoming data older than this date will be rejected to prevent duplicate measurements
*/
private var newestMeasurementDate: Date {
get {
Date(seconds: newestMeasurementTime)
@ -30,8 +35,6 @@ final class TemperatureStorage: ObservableObject {
@Published
var dailyMeasurementCounts: [MeasurementDailyCount] = []
private var unsavedMeasurements: [TemperatureMeasurement] = []
private let fileNameFormatter: DateFormatter
private let storageFolder: URL
@ -98,6 +101,12 @@ final class TemperatureStorage: ObservableObject {
.filter { $0.date >= startDate }
recentMeasurements = yesterdayValues + todayValues
}
private func updateLastMeasurements(_ measurements: [TemperatureMeasurement]) {
let startDate = Date().addingTimeInterval(-lastValueInterval).seconds
let new = recentMeasurements + measurements
recentMeasurements = Array(new.drop { $0.id < startDate })
}
private func loadMeasurements(for date: Date) -> [TemperatureMeasurement] {
loadMeasurements(from: fileName(for: date))
@ -123,14 +132,20 @@ final class TemperatureStorage: ObservableObject {
return []
}
}
func save() {
for (dateIndex, values) in unsavedMeasurements.splitByDate() {
func add(_ measurements: [TemperatureMeasurement]) {
let lastDate = self.newestMeasurementDate.seconds
let newValues = measurements
.filter { $0.id > lastDate }
.splitByDate()
for (dateIndex, values) in newValues {
let count = saveNew(values, for: dateIndex)
print("Day \(dateIndex): \(count) of \(values.count) saved")
setDailyCount(count, for: dateIndex)
print("Day \(dateIndex): \(count) values")
}
unsavedMeasurements = []
saveDailyCounts()
updateLastMeasurements(measurements)
}
/**
@ -138,21 +153,9 @@ final class TemperatureStorage: ObservableObject {
*/
private func saveNew(_ measurements: [TemperatureMeasurement], for dateIndex: Int) -> Int {
let fileName = fileName(for: dateIndex)
var existing = loadMeasurements(from: fileName)
guard !existing.isEmpty else {
save(measurements, for: fileName)
setDailyCount(measurements.count, for: dateIndex)
return measurements.count
}
var inserted = 0
for value in measurements {
if existing.insert(value) {
inserted += 1
}
}
save(existing, for: fileName)
setDailyCount(existing.count, for: dateIndex)
return inserted
let values = loadMeasurements(from: fileName) + measurements
save(values, for: fileName)
return values.count
}
private func save(_ measurements: [TemperatureMeasurement], for fileName: String) {
@ -239,23 +242,6 @@ final class TemperatureStorage: ObservableObject {
}
extension TemperatureStorage: TemperatureDataTransferDelegate {
func didReceiveRecording(_ measurement: TemperatureMeasurement) {
// Add to unsaved measurements
if unsavedMeasurements.insert(measurement) {
incrementCount(for: measurement.date.dateIndex)
}
// Add to last measurements
recentMeasurements.insert(measurement)
}
func saveAfterTransfer() {
save()
}
}
private extension Array where Element == TemperatureMeasurement {
@discardableResult