DeterminationStorage.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import CoreData
  2. import Foundation
  3. import Swinject
  4. protocol DeterminationStorage {
  5. func fetchLastDeterminationObjectID(predicate: NSPredicate, fetchLimit: Int) 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, fetchLimit: Int) 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: fetchLimit,
  23. batchSize: 50
  24. )
  25. return await backgroundContext.perform {
  26. results.map(\.objectID)
  27. }
  28. }
  29. func getForecasts(for determinationID: NSManagedObjectID, in context: NSManagedObjectContext) -> [Forecast] {
  30. do {
  31. guard let determination = try context.existingObject(with: determinationID) as? OrefDetermination,
  32. let forecastSet = determination.forecasts,
  33. let forecasts = Array(forecastSet) as? [Forecast]
  34. else {
  35. return []
  36. }
  37. return forecasts
  38. } catch {
  39. debugPrint(
  40. "Failed \(DebuggingIdentifiers.failed) to fetch OrefDetermination with ID \(determinationID): \(error.localizedDescription)"
  41. )
  42. return []
  43. }
  44. }
  45. func getForecastValues(for forecastID: NSManagedObjectID, in context: NSManagedObjectContext) -> [ForecastValue] {
  46. do {
  47. guard let forecast = try context.existingObject(with: forecastID) as? Forecast,
  48. let forecastValueSet = forecast.forecastValues,
  49. let forecastValues = Array(forecastValueSet) as? [ForecastValue]
  50. else {
  51. return []
  52. }
  53. return forecastValues.sorted(by: { $0.index < $1.index })
  54. } catch {
  55. debugPrint(
  56. "Failed \(DebuggingIdentifiers.failed) to fetch Forecast with ID \(forecastID): \(error.localizedDescription)"
  57. )
  58. return []
  59. }
  60. }
  61. }