Skip to content

Commit 319626d

Browse files
committed
store 8 last points when loading data
1 parent fdbdfc6 commit 319626d

2 files changed

Lines changed: 47 additions & 17 deletions

File tree

SmogWatch WatchKit Extension/DataStore.swift

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@
88

99
import Foundation
1010

11-
private let CurrentLevelKey = "CurrentLevel"
12-
private let LastMeasurementDate = "LastMeasurementDate"
13-
private let LastUpdateDate = "LastUpdateDate"
11+
private let savedPointsKey = "SavedPoints"
12+
private let lastUpdateDateKey = "LastUpdateDate"
13+
14+
private let pointsCount = 8
15+
16+
struct DataPoint {
17+
let date: Date
18+
let value: Double
19+
}
1420

1521
class DataStore {
1622
let defaults = UserDefaults.standard
@@ -19,28 +25,51 @@ class DataStore {
1925

2026
var currentLevel: Double? {
2127
get {
22-
return defaults.object(forKey: CurrentLevelKey) as? Double
28+
return points.last?.value
2329
}
24-
set {
25-
defaults.set(newValue, forKey: CurrentLevelKey)
30+
}
31+
32+
var lastMeasurementDate: Date? {
33+
get {
34+
return points.last?.date
2635
}
2736
}
2837

2938
var lastUpdateDate: Date? {
3039
get {
31-
return defaults.object(forKey: LastUpdateDate) as? Date
40+
return defaults.object(forKey: lastUpdateDateKey) as? Date
3241
}
3342
set {
34-
defaults.set(newValue, forKey: LastUpdateDate)
43+
defaults.set(newValue, forKey: lastUpdateDateKey)
3544
}
3645
}
3746

38-
var lastMeasurementDate: Date? {
47+
var points: [DataPoint] {
3948
get {
40-
return defaults.object(forKey: LastMeasurementDate) as? Date
41-
}
42-
set {
43-
defaults.set(newValue, forKey: LastMeasurementDate)
49+
guard let tuples = defaults.object(forKey: savedPointsKey) as? [[Any]] else {
50+
return []
51+
}
52+
53+
return tuples.compactMap { t in
54+
if t.count == 2, let date = t[0] as? Date, let value = t[1] as? Double {
55+
return DataPoint(date: date, value: value)
56+
} else {
57+
return nil
58+
}
59+
}
4460
}
4561
}
62+
63+
func addPoints(_ newPoints: [DataPoint]) {
64+
var pointMap: [Date:DataPoint] = [:]
65+
66+
self.points.forEach { p in pointMap[p.date] = p }
67+
newPoints.forEach { p in pointMap[p.date] = p }
68+
69+
let allPoints = pointMap.keys.sorted().map { date in pointMap[date]! }
70+
let recentPoints = Array(allPoints.suffix(pointsCount))
71+
let encodedData = recentPoints.map { p in [p.date, p.value ]}
72+
73+
defaults.set(encodedData, forKey: savedPointsKey)
74+
}
4675
}

SmogWatch WatchKit Extension/KrakowPiosDataLoader.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,13 @@ class KrakowPiosDataLoader {
106106
if let data = data {
107107
if let response = try? JSONDecoder().decode(Response.self, from: data) {
108108
if let series = response.data.series.first {
109-
if let point = series.points.last {
110-
self.dataStore.currentLevel = point.value
111-
self.dataStore.lastMeasurementDate = point.date
109+
if let lastPoint = series.points.last {
110+
self.dataStore.addPoints(
111+
series.points.map({ DataPoint(date: $0.date, value: $0.value )})
112+
)
112113
self.dataStore.lastUpdateDate = Date()
113114

114-
NSLog("KrakowPiosDataLoader: saving data: %.0f at %@", point.value, "\(point.date)")
115+
NSLog("KrakowPiosDataLoader: saving data: %.0f at %@", lastPoint.value, "\(lastPoint.date)")
115116

116117
success = true
117118
}

0 commit comments

Comments
 (0)