@@ -23,18 +23,48 @@ final class ConnectionHistoryManager {
2323 private let historyKey = " connectionHistory "
2424 private let maxHistoryEntries = 100
2525
26- private init ( ) { }
26+ /// In-memory cache to avoid frequent UserDefaults I/O.
27+ private var cachedHistory : [ ConnectionHistoryEntry ] ?
28+ private var isDirty = false
29+
30+ private init ( ) {
31+ loadHistoryFromUserDefaults ( )
32+ }
33+
34+ /// Loads history from UserDefaults into cache.
35+ private func loadHistoryFromUserDefaults( ) {
36+ guard let data = userDefaults. data ( forKey: historyKey) ,
37+ let entries = try ? JSONDecoder ( ) . decode ( [ ConnectionHistoryEntry ] . self, from: data) else {
38+ cachedHistory = [ ]
39+ return
40+ }
41+ cachedHistory = entries. sorted { $0. timestamp > $1. timestamp }
42+ }
43+
44+ /// Saves history from cache to UserDefaults.
45+ private func saveHistoryToUserDefaults( ) {
46+ guard isDirty, let history = cachedHistory else { return }
47+
48+ if let data = try ? JSONEncoder ( ) . encode ( history) {
49+ userDefaults. set ( data, forKey: historyKey)
50+ isDirty = false
51+ }
52+ }
2753
2854 /// Gets connection history.
2955 /// - Parameter limit: Maximum number of entries (default is 50).
3056 /// - Returns: Array of history entries sorted by time (newest first).
3157 func getHistory( limit: Int = 50 ) -> [ ConnectionHistoryEntry ] {
32- guard let data = userDefaults. data ( forKey: historyKey) ,
33- let entries = try ? JSONDecoder ( ) . decode ( [ ConnectionHistoryEntry ] . self, from: data) else {
58+ // Ensure cache is loaded
59+ if cachedHistory == nil {
60+ loadHistoryFromUserDefaults ( )
61+ }
62+
63+ guard let history = cachedHistory else {
3464 return [ ]
3565 }
3666
37- return Array ( entries . sorted { $0 . timestamp > $1 . timestamp } . prefix ( limit) )
67+ return Array ( history . prefix ( limit) )
3868 }
3969
4070 /// Adds entry to connection history.
@@ -51,31 +81,32 @@ final class ConnectionHistoryManager {
5181 action: action
5282 )
5383
54- // Load existing history without sorting (raw data)
55- guard let data = userDefaults. data ( forKey: historyKey) ,
56- var history = try ? JSONDecoder ( ) . decode ( [ ConnectionHistoryEntry ] . self, from: data) else {
57- // No existing history, create new with single entry
58- if let data = try ? JSONEncoder ( ) . encode ( [ entry] ) {
59- userDefaults. set ( data, forKey: historyKey)
60- }
61- return
84+ // Ensure cache is loaded
85+ if cachedHistory == nil {
86+ loadHistoryFromUserDefaults ( )
6287 }
6388
89+ var history = cachedHistory ?? [ ]
90+
6491 // Insert new entry at the beginning (most recent)
6592 history. insert ( entry, at: 0 )
6693
67- // Trim to max entries if needed (no sorting required, already in order)
94+ // Trim to max entries if needed
6895 if history. count > maxHistoryEntries {
6996 history = Array ( history. prefix ( maxHistoryEntries) )
7097 }
7198
72- if let data = try ? JSONEncoder ( ) . encode ( history) {
73- userDefaults. set ( data, forKey: historyKey)
74- }
99+ cachedHistory = history
100+ isDirty = true
101+
102+ // Save immediately for data persistence
103+ saveHistoryToUserDefaults ( )
75104 }
76105
77106 /// Clears connection history.
78107 func clearHistory( ) {
108+ cachedHistory = [ ]
109+ isDirty = true
79110 userDefaults. removeObject ( forKey: historyKey)
80111 }
81112}
0 commit comments