Skip to content

Commit

Permalink
Core Data: experiment with callers
Browse files Browse the repository at this point in the history
  • Loading branch information
liamcharger committed Feb 2, 2025
1 parent f878443 commit 7cb0dfe
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 52 deletions.
41 changes: 17 additions & 24 deletions InfiniLink/BLE/DeviceManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class DeviceManager: ObservableObject {
}
let cbuuids = cbuuid()

let context = PersistenceController.shared.container.viewContext
let persistenceController = PersistenceController.shared
let bleManager = BLEManager.shared

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

do {
let existingDevices = try context.fetch(fetchRequest)
let existingDevices = try persistenceController.container.viewContext.fetch(fetchRequest)
if let existingDevice = existingDevices.first {
return existingDevice
}

let newDevice = Device(context: context)
let newDevice = Device(context: persistenceController.container.viewContext)
newDevice.uuid = id
newDevice.bleUUID = id
newDevice.blefsVersion = ""
Expand All @@ -108,7 +108,10 @@ class DeviceManager: ObservableObject {
newDevice.modelNumber = ""
newDevice.serial = ""

try context.save()
Task {
await persistenceController.save()
}

return newDevice
} catch {
log("Error fetching or saving device: \(error)", caller: "DeviceManager")
Expand All @@ -131,21 +134,21 @@ class DeviceManager: ObservableObject {
device.stepsGoal = Int32(settings.stepsGoal)
device.screenTimeout = Int32(settings.screenTimeOut)

let pineTimeStyle = PineTimeStyleWatchface(context: context)
let pineTimeStyle = PineTimeStyleWatchface(context: persistenceController.container.viewContext)
pineTimeStyle.colorBG = Int16(settings.pineTimeStyle.ColorBG.rawValue)
pineTimeStyle.colorBar = Int16(settings.pineTimeStyle.ColorBar.rawValue)
pineTimeStyle.colorTime = Int16(settings.pineTimeStyle.ColorTime.rawValue)
pineTimeStyle.guageStyle = Int16(settings.pineTimeStyle.gaugeStyle.rawValue)
pineTimeStyle.weatherEnable = Int16(settings.pineTimeStyle.weatherEnable.rawValue)
device.pineTimeStyle = pineTimeStyle

let infineatWatchFace = InfineatWatchface(context: context)
let infineatWatchFace = InfineatWatchface(context: persistenceController.container.viewContext)
infineatWatchFace.colorIndex = Int16(settings.watchFaceInfineat.colorIndex)
infineatWatchFace.showSideCover = settings.watchFaceInfineat.showSideCover
device.watchFaceInfineat = infineatWatchFace

Task {
await save()
await persistenceController.save()
}

getSettings()
Expand All @@ -158,7 +161,7 @@ class DeviceManager: ObservableObject {
device.name = name

Task {
await save()
await persistenceController.save()
}
}

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

do {
let existingDevices = try context.fetch(fetchRequest)
let existingDevices = try persistenceController.container.viewContext.fetch(fetchRequest)

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

func removeDevice(_ device: Device) async {
do {
try await context.perform {
self.context.delete(device)
try self.context.save()
try await persistenceController.container.viewContext.perform {
self.persistenceController.container.viewContext.delete(device)
try self.persistenceController.container.viewContext.save()
}
} catch {
log(error.localizedDescription, caller: "DeviceManager - removeDevice")
Expand All @@ -194,23 +197,13 @@ class DeviceManager: ObservableObject {
let fetchRequest: NSFetchRequest<Device> = Device.fetchRequest()

do {
try await context.perform {
self.watches = try self.context.fetch(fetchRequest)
try await persistenceController.container.viewContext.perform {
self.watches = try self.persistenceController.container.viewContext.fetch(fetchRequest)
}
} catch {
log("Error fetching devices: \(error.localizedDescription)", caller: "DeviceManager")
}
}

func save() async {
do {
try await context.perform {
try self.context.save()
}
} catch {
log(error.localizedDescription, caller: "DeviceManager - updateSettings")
}
}
}

extension DeviceManager {
Expand Down
32 changes: 13 additions & 19 deletions InfiniLink/Utils/ChartManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import SwiftUI
import CoreData

class ChartManager: ObservableObject {
let viewContext = PersistenceController.shared.container.viewContext
let persistenceController = PersistenceController.shared
let bleManager = BLEManager.shared

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

func addStepDataPoint(steps: Int32, time: Date) {
let heartRateDataPoint = StepCounts(context: viewContext)
let heartRateDataPoint = StepCounts(context: persistenceController.container.viewContext)
heartRateDataPoint.steps = steps
heartRateDataPoint.timestamp = time
heartRateDataPoint.deviceId = bleManager.pairedDeviceID

do {
try viewContext.save()
} catch {
log("Failed to save heart rate data point: \(error.localizedDescription)", caller: "ChartManager")
Task {
await persistenceController.save()
}
}

func addHeartRateDataPoint(heartRate: Double, time: Date) {
let heartRateDataPoint = HeartDataPoint(context: viewContext)
let heartRateDataPoint = HeartDataPoint(context: persistenceController.container.viewContext)
heartRateDataPoint.value = heartRate
heartRateDataPoint.timestamp = time
heartRateDataPoint.deviceId = bleManager.pairedDeviceID

do {
try viewContext.save()
} catch {
log("Failed to save heart rate data point: \(error.localizedDescription)", caller: "ChartManager")
Task {
await persistenceController.save()
}
}

func addBatteryDataPoint(batteryLevel: Double, time: Date) {
let batteryDataPoint = BatteryDataPoint(context: viewContext)
let batteryDataPoint = BatteryDataPoint(context: persistenceController.container.viewContext)
batteryDataPoint.value = batteryLevel
batteryDataPoint.timestamp = time
batteryDataPoint.deviceId = bleManager.pairedDeviceID

do {
try viewContext.save()
} catch {
log("Failed to save battery data point: \(error.localizedDescription)", caller: "ChartManager")
Task {
await persistenceController.save()
}
}

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

do {
return try viewContext.fetch(fetchRequest)
return try persistenceController.container.viewContext.fetch(fetchRequest)
.filter { record in
return record.deviceId == bleManager.pairedDeviceID
}
Expand All @@ -75,7 +69,7 @@ class ChartManager: ObservableObject {
let fetchRequest: NSFetchRequest<StepCounts> = StepCounts.fetchRequest()

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

do {
return try viewContext.fetch(fetchRequest).filter({ $0.deviceId == bleManager.pairedDeviceID })
return try persistenceController.container.viewContext.fetch(fetchRequest).filter({ $0.deviceId == bleManager.pairedDeviceID })
} catch {
log("Failed to fetch battery data points: \(error)", caller: "ChartManager")
return []
Expand Down
10 changes: 10 additions & 0 deletions InfiniLink/Utils/PersistenceController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,14 @@ struct PersistenceController {
})
container.viewContext.automaticallyMergesChangesFromParent = true
}

func save() async {
do {
try await container.viewContext.perform {
try container.viewContext.save()
}
} catch {
log("Unresolved error saving context: \(error.localizedDescription)", caller: "PersistenceController")
}
}
}
16 changes: 7 additions & 9 deletions InfiniLink/Utils/StepCountManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class StepCountManager: ObservableObject {
static let shared = StepCountManager()

let chartManager = ChartManager.shared
let persistenceManager = PersistenceController.shared

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

stepCount.timestamp = date
saveContext()

Task {
await persistenceManager.save()
}
}

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

saveContext()
}

private func saveContext() {
do {
try PersistenceController.shared.container.viewContext.save()
} catch {
log(error.localizedDescription, caller: "StepCountManager")
Task {
await persistenceManager.save()
}
}
}

0 comments on commit 7cb0dfe

Please sign in to comment.