Skip to content

Commit 7cb0dfe

Browse files
committed
Core Data: experiment with callers
1 parent f878443 commit 7cb0dfe

4 files changed

Lines changed: 47 additions & 52 deletions

File tree

InfiniLink/BLE/DeviceManager.swift

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class DeviceManager: ObservableObject {
2121
}
2222
let cbuuids = cbuuid()
2323

24-
let context = PersistenceController.shared.container.viewContext
24+
let persistenceController = PersistenceController.shared
2525
let bleManager = BLEManager.shared
2626

2727
static let shared = DeviceManager()
@@ -92,12 +92,12 @@ class DeviceManager: ObservableObject {
9292
fetchRequest.predicate = NSPredicate(format: "uuid == %@", id)
9393

9494
do {
95-
let existingDevices = try context.fetch(fetchRequest)
95+
let existingDevices = try persistenceController.container.viewContext.fetch(fetchRequest)
9696
if let existingDevice = existingDevices.first {
9797
return existingDevice
9898
}
9999

100-
let newDevice = Device(context: context)
100+
let newDevice = Device(context: persistenceController.container.viewContext)
101101
newDevice.uuid = id
102102
newDevice.bleUUID = id
103103
newDevice.blefsVersion = ""
@@ -108,7 +108,10 @@ class DeviceManager: ObservableObject {
108108
newDevice.modelNumber = ""
109109
newDevice.serial = ""
110110

111-
try context.save()
111+
Task {
112+
await persistenceController.save()
113+
}
114+
112115
return newDevice
113116
} catch {
114117
log("Error fetching or saving device: \(error)", caller: "DeviceManager")
@@ -131,21 +134,21 @@ class DeviceManager: ObservableObject {
131134
device.stepsGoal = Int32(settings.stepsGoal)
132135
device.screenTimeout = Int32(settings.screenTimeOut)
133136

134-
let pineTimeStyle = PineTimeStyleWatchface(context: context)
137+
let pineTimeStyle = PineTimeStyleWatchface(context: persistenceController.container.viewContext)
135138
pineTimeStyle.colorBG = Int16(settings.pineTimeStyle.ColorBG.rawValue)
136139
pineTimeStyle.colorBar = Int16(settings.pineTimeStyle.ColorBar.rawValue)
137140
pineTimeStyle.colorTime = Int16(settings.pineTimeStyle.ColorTime.rawValue)
138141
pineTimeStyle.guageStyle = Int16(settings.pineTimeStyle.gaugeStyle.rawValue)
139142
pineTimeStyle.weatherEnable = Int16(settings.pineTimeStyle.weatherEnable.rawValue)
140143
device.pineTimeStyle = pineTimeStyle
141144

142-
let infineatWatchFace = InfineatWatchface(context: context)
145+
let infineatWatchFace = InfineatWatchface(context: persistenceController.container.viewContext)
143146
infineatWatchFace.colorIndex = Int16(settings.watchFaceInfineat.colorIndex)
144147
infineatWatchFace.showSideCover = settings.watchFaceInfineat.showSideCover
145148
device.watchFaceInfineat = infineatWatchFace
146149

147150
Task {
148-
await save()
151+
await persistenceController.save()
149152
}
150153

151154
getSettings()
@@ -158,7 +161,7 @@ class DeviceManager: ObservableObject {
158161
device.name = name
159162

160163
Task {
161-
await save()
164+
await persistenceController.save()
162165
}
163166
}
164167

@@ -167,7 +170,7 @@ class DeviceManager: ObservableObject {
167170
fetchRequest.predicate = NSPredicate(format: "uuid == %@", uuid)
168171

169172
do {
170-
let existingDevices = try context.fetch(fetchRequest)
173+
let existingDevices = try persistenceController.container.viewContext.fetch(fetchRequest)
171174

172175
if let existingDevice = existingDevices.first {
173176
return existingDevice.name ?? "InfiniTime"
@@ -181,9 +184,9 @@ class DeviceManager: ObservableObject {
181184

182185
func removeDevice(_ device: Device) async {
183186
do {
184-
try await context.perform {
185-
self.context.delete(device)
186-
try self.context.save()
187+
try await persistenceController.container.viewContext.perform {
188+
self.persistenceController.container.viewContext.delete(device)
189+
try self.persistenceController.container.viewContext.save()
187190
}
188191
} catch {
189192
log(error.localizedDescription, caller: "DeviceManager - removeDevice")
@@ -194,23 +197,13 @@ class DeviceManager: ObservableObject {
194197
let fetchRequest: NSFetchRequest<Device> = Device.fetchRequest()
195198

196199
do {
197-
try await context.perform {
198-
self.watches = try self.context.fetch(fetchRequest)
200+
try await persistenceController.container.viewContext.perform {
201+
self.watches = try self.persistenceController.container.viewContext.fetch(fetchRequest)
199202
}
200203
} catch {
201204
log("Error fetching devices: \(error.localizedDescription)", caller: "DeviceManager")
202205
}
203206
}
204-
205-
func save() async {
206-
do {
207-
try await context.perform {
208-
try self.context.save()
209-
}
210-
} catch {
211-
log(error.localizedDescription, caller: "DeviceManager - updateSettings")
212-
}
213-
}
214207
}
215208

216209
extension DeviceManager {

InfiniLink/Utils/ChartManager.swift

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import SwiftUI
1010
import CoreData
1111

1212
class ChartManager: ObservableObject {
13-
let viewContext = PersistenceController.shared.container.viewContext
13+
let persistenceController = PersistenceController.shared
1414
let bleManager = BLEManager.shared
1515

1616
@AppStorage("heartRateChartDataSelection") var heartRateChartDataSelection = 0
@@ -19,49 +19,43 @@ class ChartManager: ObservableObject {
1919
static let shared = ChartManager()
2020

2121
func addStepDataPoint(steps: Int32, time: Date) {
22-
let heartRateDataPoint = StepCounts(context: viewContext)
22+
let heartRateDataPoint = StepCounts(context: persistenceController.container.viewContext)
2323
heartRateDataPoint.steps = steps
2424
heartRateDataPoint.timestamp = time
2525
heartRateDataPoint.deviceId = bleManager.pairedDeviceID
2626

27-
do {
28-
try viewContext.save()
29-
} catch {
30-
log("Failed to save heart rate data point: \(error.localizedDescription)", caller: "ChartManager")
27+
Task {
28+
await persistenceController.save()
3129
}
3230
}
3331

3432
func addHeartRateDataPoint(heartRate: Double, time: Date) {
35-
let heartRateDataPoint = HeartDataPoint(context: viewContext)
33+
let heartRateDataPoint = HeartDataPoint(context: persistenceController.container.viewContext)
3634
heartRateDataPoint.value = heartRate
3735
heartRateDataPoint.timestamp = time
3836
heartRateDataPoint.deviceId = bleManager.pairedDeviceID
3937

40-
do {
41-
try viewContext.save()
42-
} catch {
43-
log("Failed to save heart rate data point: \(error.localizedDescription)", caller: "ChartManager")
38+
Task {
39+
await persistenceController.save()
4440
}
4541
}
4642

4743
func addBatteryDataPoint(batteryLevel: Double, time: Date) {
48-
let batteryDataPoint = BatteryDataPoint(context: viewContext)
44+
let batteryDataPoint = BatteryDataPoint(context: persistenceController.container.viewContext)
4945
batteryDataPoint.value = batteryLevel
5046
batteryDataPoint.timestamp = time
5147
batteryDataPoint.deviceId = bleManager.pairedDeviceID
5248

53-
do {
54-
try viewContext.save()
55-
} catch {
56-
log("Failed to save battery data point: \(error.localizedDescription)", caller: "ChartManager")
49+
Task {
50+
await persistenceController.save()
5751
}
5852
}
5953

6054
func heartPoints() -> [HeartDataPoint] {
6155
let fetchRequest: NSFetchRequest<HeartDataPoint> = HeartDataPoint.fetchRequest()
6256

6357
do {
64-
return try viewContext.fetch(fetchRequest)
58+
return try persistenceController.container.viewContext.fetch(fetchRequest)
6559
.filter { record in
6660
return record.deviceId == bleManager.pairedDeviceID
6761
}
@@ -75,7 +69,7 @@ class ChartManager: ObservableObject {
7569
let fetchRequest: NSFetchRequest<StepCounts> = StepCounts.fetchRequest()
7670

7771
do {
78-
return try viewContext.fetch(fetchRequest)
72+
return try persistenceController.container.viewContext.fetch(fetchRequest)
7973
.filter { record in
8074
return record.deviceId == bleManager.pairedDeviceID
8175
}
@@ -95,7 +89,7 @@ class ChartManager: ObservableObject {
9589
fetchRequest.predicate = NSPredicate(format: "time >= %@ AND time < %@", startOfDay as NSDate, endOfDay as NSDate)
9690

9791
do {
98-
return try viewContext.fetch(fetchRequest).filter({ $0.deviceId == bleManager.pairedDeviceID })
92+
return try persistenceController.container.viewContext.fetch(fetchRequest).filter({ $0.deviceId == bleManager.pairedDeviceID })
9993
} catch {
10094
log("Failed to fetch battery data points: \(error)", caller: "ChartManager")
10195
return []

InfiniLink/Utils/PersistenceController.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,14 @@ struct PersistenceController {
6262
})
6363
container.viewContext.automaticallyMergesChangesFromParent = true
6464
}
65+
66+
func save() async {
67+
do {
68+
try await container.viewContext.perform {
69+
try container.viewContext.save()
70+
}
71+
} catch {
72+
log("Unresolved error saving context: \(error.localizedDescription)", caller: "PersistenceController")
73+
}
74+
}
6575
}

InfiniLink/Utils/StepCountManager.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class StepCountManager: ObservableObject {
1111
static let shared = StepCountManager()
1212

1313
let chartManager = ChartManager.shared
14+
let persistenceManager = PersistenceController.shared
1415

1516
func setStepCount(steps: Int32, isArbitrary: Bool, for date: Date) {
1617
let existingCounts = chartManager.stepPoints()
@@ -31,7 +32,10 @@ class StepCountManager: ObservableObject {
3132
}
3233

3334
stepCount.timestamp = date
34-
saveContext()
35+
36+
Task {
37+
await persistenceManager.save()
38+
}
3539
}
3640

3741
func clearCurrentDaySteps() {
@@ -45,14 +49,8 @@ class StepCountManager: ObservableObject {
4549
chartManager.addStepDataPoint(steps: 0, time: today)
4650
}
4751

48-
saveContext()
49-
}
50-
51-
private func saveContext() {
52-
do {
53-
try PersistenceController.shared.container.viewContext.save()
54-
} catch {
55-
log(error.localizedDescription, caller: "StepCountManager")
52+
Task {
53+
await persistenceManager.save()
5654
}
5755
}
5856
}

0 commit comments

Comments
 (0)