Skip to content

Commit 571f3cf

Browse files
committed
Persist preferredTaskDate to avoid any issues with the app gets terminated and relaunched in the background
1 parent 14fd3ad commit 571f3cf

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

WooCommerce/Classes/Tools/BackgroundTasks/BackgroundTaskRefreshDispatcher.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import BackgroundTasks
44
import Network
55

66
final class BackgroundTaskRefreshDispatcher {
7-
enum BackgroundTaskType: CaseIterable {
7+
enum BackgroundTaskType: Codable, CaseIterable {
88
case ordersAndDashboardSync
99
case posCatalogSync
1010
}

WooCommerce/Classes/Tools/BackgroundTasks/BackgroundTaskSchedule.swift

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
///
1717
final 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+
}

WooCommerce/WooCommerceTests/Tools/BackgroundTaskScheduleTests.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ struct BackgroundTaskScheduleTests {
88
private let timeProvider: MockTimeProvider
99

1010
init() {
11+
let userDefaults = UserDefaults(suiteName: #file)!
12+
userDefaults.removePersistentDomain(forName: #file)
1113
timeProvider = MockTimeProvider()
12-
sut = BackgroundTaskSchedule(timeProvider: timeProvider)
14+
sut = BackgroundTaskSchedule(timeProvider: timeProvider, userDefaults: userDefaults)
1315
}
1416

1517
@Test func initial_state_returns_task_with_shortest_period() {

0 commit comments

Comments
 (0)