GlucoseManager.swift 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import Combine
  2. import Foundation
  3. import SwiftDate
  4. import Swinject
  5. protocol GlucoseManager {}
  6. final class BaseGlucoseManager: GlucoseManager, Injectable {
  7. private let processQueue = DispatchQueue(label: "BaseGlucoseManager.processQueue")
  8. @Injected() var glucoseStogare: GlucoseStorage!
  9. @Injected() var nightscoutManager: NightscoutManager!
  10. @Injected() var apsManager: APSManager!
  11. private var lifetime = Set<AnyCancellable>()
  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<(Date, [BloodGlucose]), Never> in
  21. debug(.nightscout, "Glucose manager heartbeat")
  22. debug(.nightscout, "Start fetching glucose")
  23. return Publishers.CombineLatest(Just(self.glucoseStogare.syncDate()), self.nightscoutManager.fetchGlucose())
  24. .eraseToAnyPublisher()
  25. }
  26. .sink { syncDate, glucose in
  27. // Because of Spike dosn't respect a date query
  28. let filteredByDate = glucose.filter { $0.dateString > syncDate }
  29. let filtered = self.glucoseStogare.filterTooFrequentGlucose(filteredByDate)
  30. if !filtered.isEmpty {
  31. debug(.nightscout, "New glucose found")
  32. self.apsManager.heartbeat(force: true)
  33. } else {
  34. self.apsManager.heartbeat(force: false)
  35. }
  36. }
  37. .store(in: &lifetime)
  38. timer.resume()
  39. }
  40. }