DeterminationSetup.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import CoreData
  2. import Foundation
  3. extension Home.StateModel {
  4. // MARK: - Enacted Determination
  5. @MainActor func setupEnactedDeterminationController() {
  6. enactedDeterminationControllerDelegate.onContentChange = { [weak self] in
  7. Task { @MainActor in
  8. self?.scheduleForecastUpdate()
  9. }
  10. }
  11. do {
  12. try enactedDeterminationController.performFetch()
  13. updateEnactedDeterminationFromController()
  14. // Initial population; assigned to `forecastUpdateTask` so a change arriving
  15. // during startup cancels it instead of racing it.
  16. forecastUpdateTask = Task { @MainActor in
  17. await self.updateForecastData()
  18. }
  19. } catch {
  20. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform enacted determination fetch: \(error)")
  21. }
  22. }
  23. /// Coalesces rapid determination changes — each cancels the previous pending recompute.
  24. @MainActor func scheduleForecastUpdate() {
  25. forecastUpdateTask?.cancel()
  26. forecastUpdateTask = Task { @MainActor in
  27. try? await Task.sleep(for: .milliseconds(150))
  28. guard !Task.isCancelled else { return }
  29. updateEnactedDeterminationFromController()
  30. await updateForecastData()
  31. }
  32. }
  33. @MainActor private func updateEnactedDeterminationFromController() {
  34. guard let objects = enactedDeterminationController.fetchedObjects else { return }
  35. determinationsFromPersistence = objects
  36. }
  37. // MARK: - Determinations for COB/IOB Charts
  38. @MainActor func setupDeterminationController() {
  39. determinationControllerDelegate.onContentChange = { [weak self] in
  40. Task { @MainActor in
  41. self?.updateDeterminationsFromController()
  42. }
  43. }
  44. do {
  45. try determinationController.performFetch()
  46. updateDeterminationsFromController()
  47. } catch {
  48. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform determination fetch: \(error)")
  49. }
  50. }
  51. @MainActor func updateDeterminationsFromController() {
  52. guard let objects = determinationController.fetchedObjects else { return }
  53. enactedAndNonEnactedDeterminations = objects
  54. yAxisChartDataCobChart(determinations: objects)
  55. yAxisChartDataIobChart(determinations: objects)
  56. }
  57. }