-
Notifications
You must be signed in to change notification settings - Fork 166
/
Copy pathUserDefaultsQueue.swift
63 lines (51 loc) · 1.93 KB
/
UserDefaultsQueue.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import Foundation
import MatomoTracker
public final class UserDefaultsQueue: NSObject, Queue {
private var items: [Event] {
didSet {
if autoSave {
try? UserDefaultsQueue.write(items, to: userDefaults)
}
}
}
private let userDefaults: UserDefaults
private let autoSave: Bool
init(_ userDefaults: UserDefaults, autoSave: Bool = false) {
self.userDefaults = userDefaults
self.autoSave = autoSave
self.items = (try? UserDefaultsQueue.readEvents(from: userDefaults)) ?? []
super.init()
}
public var eventCount: Int {
return items.count
}
public func enqueue(events: [Event], completion: (()->())?) {
items.append(contentsOf: events)
completion?()
}
public func first(limit: Int, completion: (_ items: [Event])->()) {
let amount = [limit,eventCount].min()!
let dequeuedItems = Array(items[0..<amount])
completion(dequeuedItems)
}
public func remove(events: [Event], completion: ()->()) {
items = items.filter({ event in !events.contains(where: { eventToRemove in eventToRemove.uuid == event.uuid })})
completion()
}
public func save() throws {
try UserDefaultsQueue.write(items, to: userDefaults)
}
}
extension UserDefaultsQueue {
private static let userDefaultsKey = "UserDefaultsQueue.items"
private static func readEvents(from userDefaults: UserDefaults) throws -> [Event] {
guard let data = userDefaults.data(forKey: userDefaultsKey) else { return [] }
let decoder = JSONDecoder()
return try decoder.decode([Event].self, from: data)
}
private static func write(_ events: [Event], to userDefaults: UserDefaults) throws {
let encoder = JSONEncoder()
let data = try encoder.encode(events)
userDefaults.set(data, forKey: userDefaultsKey)
}
}