AlarmTask.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // AlarmTask.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-01-12.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. extension MainViewController {
  10. func scheduleAlarmTask(initialDelay: TimeInterval = 1) {
  11. let firstRun = Date().addingTimeInterval(initialDelay)
  12. TaskScheduler.shared.scheduleTask(id: .alarmCheck, nextRun: firstRun) { [weak self] in
  13. guard let self = self else { return }
  14. self.alarmTaskAction()
  15. }
  16. }
  17. func alarmTaskAction() {
  18. DispatchQueue.main.async {
  19. var alarmData = AlarmData(
  20. expireDate: .distantPast // Storage.shared.expirationDate.value
  21. )
  22. self.saveLatestAlarmDataToFile(alarmData)
  23. alarmData = self.loadTestAlarmData() ?? alarmData
  24. LogManager.shared.log(category: .alarm, message: "Checking alarms based on \(alarmData)", isDebug: true)
  25. AlarmManager.shared.checkAlarms(data: alarmData)
  26. TaskScheduler.shared.rescheduleTask(id: .alarmCheck, to: Date().addingTimeInterval(60))
  27. }
  28. }
  29. func saveLatestAlarmDataToFile(_ alarmData: AlarmData) {
  30. let encoder = JSONEncoder()
  31. encoder.dateEncodingStrategy = .iso8601
  32. do {
  33. let data = try encoder.encode(alarmData)
  34. let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("latestAlarmData.json")
  35. try data.write(to: url)
  36. } catch {
  37. LogManager.shared.log(category: .alarm, message: "Failed to save latest AlarmData: \(error)", isDebug: true)
  38. }
  39. }
  40. func loadTestAlarmData() -> AlarmData? {
  41. let fileManager = FileManager.default
  42. let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("testAlarmData.json")
  43. if fileManager.fileExists(atPath: url.path) {
  44. do {
  45. let data = try Data(contentsOf: url)
  46. let decoder = JSONDecoder()
  47. decoder.dateDecodingStrategy = .iso8601
  48. let alarmData = try decoder.decode(AlarmData.self, from: data)
  49. LogManager.shared.log(category: .alarm, message: "Loaded test AlarmData from \(url.path)", isDebug: true)
  50. return alarmData
  51. } catch {
  52. LogManager.shared.log(category: .alarm, message: "Failed to load test AlarmData: \(error)", isDebug: true)
  53. }
  54. }
  55. return nil
  56. }
  57. }