DeterminationStorage.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import CoreData
  2. import Foundation
  3. import Swinject
  4. protocol DeterminationStorage {
  5. func fetchLastDeterminationObjectID(predicate: NSPredicate) async -> [NSManagedObjectID]
  6. func getForecasts(for determinationID: NSManagedObjectID, in context: NSManagedObjectContext) -> [Forecast]
  7. func getForecastValues(for forecastID: NSManagedObjectID, in context: NSManagedObjectContext) -> [ForecastValue]
  8. }
  9. final class BaseDeterminationStorage: DeterminationStorage, Injectable {
  10. private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
  11. private let backgroundContext = CoreDataStack.shared.newTaskContext()
  12. init(resolver: Resolver) {
  13. injectServices(resolver)
  14. }
  15. func fetchLastDeterminationObjectID(predicate: NSPredicate) async -> [NSManagedObjectID] {
  16. let results = await CoreDataStack.shared.fetchEntitiesAsync(
  17. ofType: OrefDetermination.self,
  18. onContext: backgroundContext,
  19. predicate: predicate,
  20. key: "deliverAt",
  21. ascending: false,
  22. fetchLimit: 1
  23. )
  24. return await backgroundContext.perform {
  25. results.map(\.objectID)
  26. }
  27. }
  28. func getForecasts(for determinationID: NSManagedObjectID, in context: NSManagedObjectContext) -> [Forecast] {
  29. do {
  30. guard let determination = try context.existingObject(with: determinationID) as? OrefDetermination,
  31. let forecastSet = determination.forecasts,
  32. let forecasts = Array(forecastSet) as? [Forecast]
  33. else {
  34. return []
  35. }
  36. return forecasts
  37. } catch {
  38. debugPrint(
  39. "Failed \(DebuggingIdentifiers.failed) to fetch OrefDetermination with ID \(determinationID): \(error.localizedDescription)"
  40. )
  41. return []
  42. }
  43. }
  44. func getForecastValues(for forecastID: NSManagedObjectID, in context: NSManagedObjectContext) -> [ForecastValue] {
  45. do {
  46. guard let forecast = try context.existingObject(with: forecastID) as? Forecast,
  47. let forecastValueSet = forecast.forecastValues,
  48. let forecastValues = Array(forecastValueSet) as? [ForecastValue]
  49. else {
  50. return []
  51. }
  52. return forecastValues.sorted(by: { $0.index < $1.index })
  53. } catch {
  54. debugPrint(
  55. "Failed \(DebuggingIdentifiers.failed) to fetch Forecast with ID \(forecastID): \(error.localizedDescription)"
  56. )
  57. return []
  58. }
  59. }
  60. }