OverrideSetup.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import CoreData
  2. import Foundation
  3. extension Home.StateModel {
  4. // MARK: - Overrides
  5. @MainActor func setupOverrideController() {
  6. overrideControllerDelegate.onContentChange = { [weak self] in
  7. Task { @MainActor in
  8. self?.updateOverridesFromController()
  9. }
  10. }
  11. do {
  12. try overrideController.performFetch()
  13. updateOverridesFromController()
  14. } catch {
  15. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform override fetch: \(error)")
  16. }
  17. }
  18. @MainActor private func updateOverridesFromController() {
  19. guard let objects = overrideController.fetchedObjects else { return }
  20. overrides = objects
  21. }
  22. // MARK: - Override Runs
  23. @MainActor func setupOverrideRunController() {
  24. overrideRunControllerDelegate.onContentChange = { [weak self] in
  25. Task { @MainActor in
  26. self?.updateOverrideRunsFromController()
  27. }
  28. }
  29. do {
  30. try overrideRunController.performFetch()
  31. updateOverrideRunsFromController()
  32. } catch {
  33. debug(.default, "\(DebuggingIdentifiers.failed) Failed to perform override run fetch: \(error)")
  34. }
  35. }
  36. @MainActor func updateOverrideRunsFromController() {
  37. guard let objects = overrideRunController.fetchedObjects else { return }
  38. overrideRunStored = objects
  39. }
  40. // MARK: - Override Actions
  41. /// Cancels the running Override, creates an entry in the OverrideRunStored Core Data entity and posts a custom notification so that the AdjustmentsView gets updated
  42. @MainActor func cancelOverride(withID id: NSManagedObjectID) async {
  43. do {
  44. guard let profileToCancel = try viewContext.existingObject(with: id) as? OverrideStored else { return }
  45. profileToCancel.enabled = false
  46. guard viewContext.hasChanges else { return }
  47. try viewContext.save()
  48. await saveToOverrideRunStored(object: profileToCancel)
  49. Foundation.NotificationCenter.default.post(name: .didUpdateOverrideConfiguration, object: nil)
  50. } catch let error as NSError {
  51. debugPrint("\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to cancel Profile with error: \(error)")
  52. }
  53. }
  54. /// We can safely pass the NSManagedObject as we are doing everything on the Main Actor
  55. @MainActor func saveToOverrideRunStored(object: OverrideStored) async {
  56. let newOverrideRunStored = OverrideRunStored(context: viewContext)
  57. newOverrideRunStored.id = UUID()
  58. newOverrideRunStored.name = object.name
  59. newOverrideRunStored.startDate = object.date ?? .distantPast
  60. newOverrideRunStored.endDate = Date()
  61. newOverrideRunStored.target = NSDecimalNumber(decimal: overrideStorage.calculateTarget(override: object))
  62. newOverrideRunStored.override = object
  63. newOverrideRunStored.isUploadedToNS = false
  64. do {
  65. guard viewContext.hasChanges else { return }
  66. try viewContext.save()
  67. } catch let error as NSError {
  68. debugPrint(
  69. "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to save an Override to the OverrideRunStored entity with error: \(error)"
  70. )
  71. }
  72. }
  73. }