DeterminationSetup.swift 2.3 KB

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