diff options
| author | Fuwn <[email protected]> | 2026-02-18 11:45:06 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-18 11:57:36 -0800 |
| commit | 07c533116dd267e3e6e70d673f97bbb87f600f1f (patch) | |
| tree | e744ebf8b78bc23e4639cef9b4483942140c4055 /Sora/Data/Settings/SettingsManager.swift | |
| parent | test: add baseline test harness and performance baseline report (diff) | |
| download | sora-testing-07c533116dd267e3e6e70d673f97bbb87f600f1f.tar.xz sora-testing-07c533116dd267e3e6e70d673f97bbb87f600f1f.zip | |
refactor: remove duplicate settings serialisation work
Diffstat (limited to 'Sora/Data/Settings/SettingsManager.swift')
| -rw-r--r-- | Sora/Data/Settings/SettingsManager.swift | 79 |
1 files changed, 50 insertions, 29 deletions
diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift index ed29ec3..f42030f 100644 --- a/Sora/Data/Settings/SettingsManager.swift +++ b/Sora/Data/Settings/SettingsManager.swift @@ -92,13 +92,17 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l defer { isUpdatingCache = false } + let sortedBookmarks = newValue.sorted { $0.date > $1.date } + let payload = SettingsCodec.encodeOnce(sortedBookmarks) + syncableData( key: "bookmarks", localData: $bookmarksData, - newValue: newValue - ) { $0.sorted { $0.date > $1.date } } + newValue: sortedBookmarks, + encodedData: payload?.encodedData + ) { $0 } - bookmarksCache = newValue.sorted { $0.date > $1.date } + bookmarksCache = sortedBookmarks pendingSyncKeys.insert(.bookmarks) triggerBatchedSync() @@ -115,13 +119,17 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l defer { isUpdatingCache = false } + let sortedFavorites = newValue.sorted { $0.date > $1.date } + let payload = SettingsCodec.encodeOnce(sortedFavorites) + syncableData( key: "favorites", localData: $favoritesData, - newValue: newValue - ) { $0.sorted { $0.date > $1.date } } + newValue: sortedFavorites, + encodedData: payload?.encodedData + ) { $0 } - favoritesCache = newValue.sorted { $0.date > $1.date } + favoritesCache = sortedFavorites pendingSyncKeys.insert(.favorites) triggerBatchedSync() @@ -348,40 +356,48 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l thumbnailQualityCache = _thumbnailQuality } - func updateBookmarks(_ newValue: [SettingsBookmark]) async { + func updateBookmarks(_ newValue: [SettingsBookmark], encodedData: Data? = nil) async { guard !isUpdatingCache else { return } isUpdatingCache = true defer { isUpdatingCache = false } + let sortedBookmarks = newValue.sorted { $0.date > $1.date } + let resolvedEncodedData = encodedData ?? SettingsCodec.encode(sortedBookmarks) + syncableData( key: "bookmarks", localData: $bookmarksData, - newValue: newValue - ) { $0.sorted { $0.date > $1.date } } + newValue: sortedBookmarks, + encodedData: resolvedEncodedData + ) { $0 } - bookmarksCache = newValue.sorted { $0.date > $1.date } + bookmarksCache = sortedBookmarks await backupBookmarks() pendingSyncKeys.insert(.bookmarks) triggerBatchedSync() } - func updateFavorites(_ newValue: [SettingsFavoritePost]) async { + func updateFavorites(_ newValue: [SettingsFavoritePost], encodedData: Data? = nil) async { guard !isUpdatingCache else { return } isUpdatingCache = true defer { isUpdatingCache = false } + let sortedFavorites = newValue.sorted { $0.date > $1.date } + let resolvedEncodedData = encodedData ?? SettingsCodec.encode(sortedFavorites) + syncableData( key: "favorites", localData: $favoritesData, - newValue: newValue - ) { $0.sorted { $0.date > $1.date } } + newValue: sortedFavorites, + encodedData: resolvedEncodedData + ) { $0 } - favoritesCache = newValue.sorted { $0.date > $1.date } + favoritesCache = sortedFavorites await backupFavorites() pendingSyncKeys.insert(.favorites) @@ -454,11 +470,11 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l // MARK: - Private Helpers private static func encode<T: Encodable>(_ value: T) -> Data? { - try? JSONEncoder().encode(value) + SettingsCodec.encode(value) } private static func decode<T: Decodable>(_ type: T.Type, from data: Data) -> T? { - try? JSONDecoder().decode(type, from: data) + SettingsCodec.decode(type, from: data) } private func syncableData<T: Codable>( @@ -490,23 +506,22 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l key: String, localData: Binding<Data>, newValue: [T], + encodedData: Data? = nil, sort: ([T]) -> [T] ) { let sortedValues = sort(newValue) - guard let encoded = Self.encode(sortedValues) else { + guard let encoded = encodedData ?? SettingsCodec.encode(sortedValues) else { localData.wrappedValue = Data() return } - if localData.wrappedValue != encoded { - localData.wrappedValue = encoded - - if enableSync { - NSUbiquitousKeyValueStore.default.set(encoded, forKey: key) - NSUbiquitousKeyValueStore.default.synchronize() - } - } + SettingsCodec.applyIfChanged( + encodedData: encoded, + localData: localData, + key: key, + enableSync: enableSync + ) } private func triggerBatchedSync() { @@ -909,9 +924,12 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l SettingsBookmark(provider: provider, tags: normalizedTags, folder: folder) ) - if let data = Self.encode(updatedBookmarks), data.count < 1_000_000 { // 1 MB + let sortedBookmarks = updatedBookmarks.sorted { $0.date > $1.date } + if let payload = SettingsCodec.encodeOnce(sortedBookmarks), + payload.encodedData.count < 1_000_000 + { // 1 MB Task { - await updateBookmarks(updatedBookmarks) + await updateBookmarks(payload.value, encodedData: payload.encodedData) } } else { debugPrint("SettingsManager.addBookmark: iCloud data limit exceeded") @@ -1024,9 +1042,12 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l SettingsFavoritePost(post: post, provider: provider, folder: folder) ) - if let data = Self.encode(updatedFavorites), data.count < 1_000_000 { // 1 MB + let sortedFavorites = updatedFavorites.sorted { $0.date > $1.date } + if let payload = SettingsCodec.encodeOnce(sortedFavorites), + payload.encodedData.count < 1_000_000 + { // 1 MB Task { - await updateFavorites(updatedFavorites) + await updateFavorites(payload.value, encodedData: payload.encodedData) } } else { debugPrint("SettingsManager.addFavorite: iCloud data limit exceeded") |