DeterminationSetup.swift 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import CoreData
  2. import Foundation
  3. extension Home.StateModel {
  4. func setupDeterminationsArray() {
  5. Task {
  6. do {
  7. // Get the NSManagedObjectIDs
  8. async let enactedObjectIds = determinationStorage
  9. .fetchLastDeterminationObjectID(predicate: NSPredicate.enactedDetermination)
  10. async let enactedAndNonEnactedObjectIds = fetchCobAndIob()
  11. let enactedIDs = try await enactedObjectIds
  12. let enactedAndNonEnactedIds = try await enactedAndNonEnactedObjectIds
  13. // Get the NSManagedObjects and return them on the Main Thread
  14. try await updateDeterminationsArray(with: enactedIDs, keyPath: \.determinationsFromPersistence)
  15. try await updateDeterminationsArray(with: enactedAndNonEnactedIds, keyPath: \.enactedAndNonEnactedDeterminations)
  16. await updateForecastData()
  17. } catch let error as CoreDataError {
  18. debug(.default, "Core Data error in setupDeterminationsArray: \(error.localizedDescription)")
  19. } catch {
  20. debug(.default, "Unexpected error in setupDeterminationsArray: \(error.localizedDescription)")
  21. }
  22. }
  23. }
  24. @MainActor private func updateDeterminationsArray(
  25. with IDs: [NSManagedObjectID],
  26. keyPath: ReferenceWritableKeyPath<Home.StateModel, [OrefDetermination]>
  27. ) async throws {
  28. // Fetch the objects off the main thread
  29. let determinationObjects: [OrefDetermination] = try await CoreDataStack.shared
  30. .getNSManagedObject(with: IDs, context: viewContext)
  31. // Update the array on the main thread
  32. self[keyPath: keyPath] = determinationObjects
  33. }
  34. // Custom fetch to more efficiently filter only for cob and iob
  35. private func fetchCobAndIob() async throws -> [NSManagedObjectID] {
  36. let results = try await CoreDataStack.shared.fetchEntitiesAsync(
  37. ofType: OrefDetermination.self,
  38. onContext: determinationFetchContext,
  39. predicate: NSPredicate.determinationsForCobIobCharts,
  40. key: "deliverAt",
  41. ascending: false,
  42. batchSize: 50,
  43. propertiesToFetch: ["cob", "iob", "deliverAt", "objectID"]
  44. )
  45. return try await determinationFetchContext.perform {
  46. guard let fetchedResults = results as? [[String: Any]] else {
  47. throw CoreDataError.fetchError(function: #function, file: #file)
  48. }
  49. // Update Chart Scales
  50. self.yAxisChartDataCobChart(determinations: fetchedResults)
  51. self.yAxisChartDataIobChart(determinations: fetchedResults)
  52. return fetchedResults.compactMap { $0["objectID"] as? NSManagedObjectID }
  53. }
  54. }
  55. }