@@ -15,11 +15,17 @@ extension BackgroundTaskRefreshDispatcher.BackgroundTaskType {
1515/// BackgroundTaskSchedule is a helper tool to determine the next BackgroundTask based on the preferred run period
1616///
1717final class BackgroundTaskSchedule {
18- private var preferredTaskDate : [ BackgroundTaskRefreshDispatcher . BackgroundTaskType : Date ] = [ : ]
18+ private var preferredTaskDate : [ BackgroundTaskRefreshDispatcher . BackgroundTaskType : Date ] = [ : ] {
19+ didSet { setPersistedDates ( ) }
20+ }
1921 private let timeProvider : TimeProvider
22+ private let userDefaults : UserDefaults
2023
21- init ( timeProvider: TimeProvider = DefaultTimeProvider ( ) ) {
24+ init ( timeProvider: TimeProvider = DefaultTimeProvider ( ) ,
25+ userDefaults: UserDefaults = . standard) {
2226 self . timeProvider = timeProvider
27+ self . userDefaults = userDefaults
28+ loadPersistedDates ( )
2329 }
2430
2531 // Set preferred task dates when going into background
@@ -54,3 +60,24 @@ final class BackgroundTaskSchedule {
5460 preferredTaskDate [ task] = timeProvider. now ( ) . addingTimeInterval ( task. period)
5561 }
5662}
63+
64+ // MARK: - Persistence
65+
66+ private extension BackgroundTaskSchedule {
67+ private var userDefaultsKey : String { " BackgroundTaskSchedule.preferredTaskDate " }
68+
69+ private func loadPersistedDates( ) {
70+ guard let data = userDefaults. data ( forKey: userDefaultsKey) ,
71+ let decoded = try ? JSONDecoder ( ) . decode ( [ BackgroundTaskRefreshDispatcher . BackgroundTaskType : Date ] . self, from: data)
72+ else {
73+ return
74+ }
75+ preferredTaskDate = decoded
76+ }
77+
78+ private func setPersistedDates( ) {
79+ if let data = try ? JSONEncoder ( ) . encode ( preferredTaskDate) {
80+ userDefaults. set ( data, forKey: userDefaultsKey)
81+ }
82+ }
83+ }
0 commit comments