@@ -96,6 +96,9 @@ final class FilterSettingsStorage {
9696 /// Cached settings to avoid repeated UserDefaults read + JSON decode
9797 private var cachedSettings : FilterSettings ?
9898
99+ /// Per-table filter cache to avoid JSON decode on every table switch
100+ private var lastFiltersCache : [ String : [ TableFilter ] ] = [ : ]
101+
99102 /// In-memory cache for tracked filter keys. Lazy-loaded on first access
100103 /// so that `trackKey`/`removeTrackedKey` avoid redundant UserDefaults reads.
101104 private var _trackedKeys : Set < String > ?
@@ -160,12 +163,18 @@ final class FilterSettingsStorage {
160163 func loadLastFilters( for tableName: String ) -> [ TableFilter ] {
161164 let key = lastFiltersKeyPrefix + sanitizeTableName( tableName)
162165
166+ if let cached = lastFiltersCache [ key] {
167+ return cached
168+ }
169+
163170 guard let data = defaults. data ( forKey: key) else {
164171 return [ ]
165172 }
166173
167174 do {
168- return try decoder. decode ( [ TableFilter ] . self, from: data)
175+ let filters = try decoder. decode ( [ TableFilter ] . self, from: data)
176+ lastFiltersCache [ key] = filters
177+ return filters
169178 } catch {
170179 Self . logger. error ( " Failed to decode last filters for \( tableName) : \( error) " )
171180 return [ ]
@@ -180,13 +189,15 @@ final class FilterSettingsStorage {
180189 guard !filters. isEmpty else {
181190 defaults. removeObject ( forKey: key)
182191 removeTrackedKey ( key)
192+ lastFiltersCache. removeValue ( forKey: key)
183193 return
184194 }
185195
186196 do {
187197 let data = try encoder. encode ( filters)
188198 defaults. set ( data, forKey: key)
189199 trackKey ( key)
200+ lastFiltersCache [ key] = filters
190201 } catch {
191202 Self . logger. error ( " Failed to encode last filters for \( tableName) : \( error) " )
192203 }
@@ -197,6 +208,7 @@ final class FilterSettingsStorage {
197208 let key = lastFiltersKeyPrefix + sanitizeTableName( tableName)
198209 defaults. removeObject ( forKey: key)
199210 removeTrackedKey ( key)
211+ lastFiltersCache. removeValue ( forKey: key)
200212 }
201213
202214 /// Clear all stored last filters using the tracked key set instead of
0 commit comments