DeterminationSetup.swift 2.3 KB

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