66//
77
88import Foundation
9-
9+ import RealmSwift
1010#if canImport(WidgetKit)
1111import WidgetKit
1212#endif
1313
1414final class WidgetHistorySnapshotStore {
1515 static let shared = WidgetHistorySnapshotStore ( )
1616
17+ private let accessQueue = DispatchQueue ( label: " me.fin.bark.widget-history-snapshot " , qos: . utility)
18+
1719 private let encoder : JSONEncoder = {
1820 let encoder = JSONEncoder ( )
1921 encoder. dateEncodingStrategy = . iso8601
@@ -31,12 +33,28 @@ final class WidgetHistorySnapshotStore {
3133 }
3234 private init ( ) { }
3335
34- func syncFromMessages( _ messages: [ WidgetHistoryMessage ] , limit: Int = WidgetHistoryConstants . snapshotRetentionLimit) {
36+ func refreshFromRealmAsync( limit: Int = WidgetHistoryConstants . snapshotRetentionLimit) {
37+ accessQueue. async {
38+ guard let realm = try ? Realm ( ) else {
39+ return
40+ }
41+ let messages = realm. widgetSnapshotItems ( limit: limit)
42+ self . syncFromMessagesLocked ( messages, limit: limit)
43+ }
44+ }
45+
46+ func prependMessage( _ message: WidgetHistoryMessage , limit: Int = WidgetHistoryConstants . snapshotRetentionLimit) {
47+ accessQueue. sync {
48+ prependMessageLocked ( message, limit: limit)
49+ }
50+ }
51+
52+ private func syncFromMessagesLocked( _ messages: [ WidgetHistoryMessage ] , limit: Int ) {
3553 let items = Array ( messages. sorted { $0. createDate > $1. createDate } . prefix ( limit) )
3654 write ( WidgetHistorySnapshot ( messages: items) )
3755 }
3856
39- func prependMessage ( _ message: WidgetHistoryMessage , limit: Int = WidgetHistoryConstants . snapshotRetentionLimit ) {
57+ private func prependMessageLocked ( _ message: WidgetHistoryMessage , limit: Int ) {
4058 var items = load ( ) ? . messages ?? [ ]
4159 items. removeAll { $0. id == message. id }
4260 items. insert ( message, at: 0 )
0 commit comments