FetchTreatmentsManager.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import Combine
  2. import Foundation
  3. import SwiftDate
  4. import Swinject
  5. protocol FetchTreatmentsManager {}
  6. final class BaseFetchTreatmentsManager: FetchTreatmentsManager, Injectable {
  7. private let processQueue = DispatchQueue(label: "BaseFetchTreatmentsManager.processQueue")
  8. @Injected() var nightscoutManager: NightscoutManager!
  9. @Injected() var tempTargetsStorage: TempTargetsStorage!
  10. @Injected() var carbsStorage: CarbsStorage!
  11. private var lifetime = Lifetime()
  12. private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
  13. init(resolver: Resolver) {
  14. injectServices(resolver)
  15. subscribe()
  16. }
  17. private func subscribe() {
  18. timer.publisher
  19. .receive(on: processQueue)
  20. .flatMap { _ -> AnyPublisher<([CarbsEntry], [TempTarget]), Never> in
  21. debug(.nightscout, "FetchTreatmentsManager heartbeat")
  22. debug(.nightscout, "Start fetching carbs and temptargets")
  23. return Publishers.CombineLatest(
  24. self.nightscoutManager.fetchCarbs(),
  25. self.nightscoutManager.fetchTempTargets()
  26. ).eraseToAnyPublisher()
  27. }
  28. .sink { carbs, targets in
  29. let filteredCarbs = carbs.filter { !($0.enteredBy?.contains(CarbsEntry.manual) ?? false) }
  30. if filteredCarbs.isNotEmpty {
  31. self.carbsStorage.storeCarbs(filteredCarbs)
  32. }
  33. let filteredTargets = targets.filter { !($0.enteredBy?.contains(TempTarget.manual) ?? false) }
  34. if filteredTargets.isNotEmpty {
  35. self.tempTargetsStorage.storeTempTargets(filteredTargets)
  36. }
  37. }
  38. .store(in: &lifetime)
  39. timer.fire()
  40. timer.resume()
  41. }
  42. }