diff options
| author | Fuwn <[email protected]> | 2025-03-03 19:57:18 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-03-03 19:57:18 -0800 |
| commit | 0190ea111951ea4059b0b83f28fbabd8ef3b1a4b (patch) | |
| tree | 76d011e1180404d4a151c87ba09ffff0b467c7ca | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-0190ea111951ea4059b0b83f28fbabd8ef3b1a4b.tar.xz sora-testing-0190ea111951ea4059b0b83f28fbabd8ef3b1a4b.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 24 | ||||
| -rw-r--r-- | Sora/Data/Booru/BooruPageCacheEntry.swift | 14 |
2 files changed, 38 insertions, 0 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 2206387..1121fc1 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -22,6 +22,8 @@ class BooruManager: ObservableObject { for: .cachesDirectory, in: .userDomainMask ).first? .appendingPathComponent("\(BooruProvider.safebooru.asFileNameComponent)_tags.json") + private let pageCache = NSCache<NSString, BooruPageCacheEntry>() // swiftlint:disable:this legacy_objc_type + private let cacheDuration: TimeInterval = 300 // MARK: - Computed Properties var tags: [String] { @@ -38,6 +40,8 @@ class BooruManager: ObservableObject { self.provider = provider self.flavor = BooruProviderFlavor(provider: provider) self.domain = provider.domain + pageCache.countLimit = 50 + pageCache.totalCostLimit = 50 * 1_024 * 1_024 } // MARK: - Public Methods @@ -53,6 +57,20 @@ class BooruManager: ObservableObject { let url = urlForPosts(page: flavor == .gelbooru ? page - 1 : page, limit: limit, tags: tags) else { return } + let cacheKey = "\(url.absoluteString)_\(replace)" as NSString // swiftlint:disable:this legacy_objc_type + + if let cachedEntry = pageCache.object(forKey: cacheKey), + !cachedEntry.isExpired + { + isLoading = true + + defer { isLoading = false } + + updatePosts(cachedEntry.posts, replace: replace) + + return + } + isLoading = true currentTask?.cancel() @@ -66,7 +84,9 @@ class BooruManager: ObservableObject { guard !Task.isCancelled else { return } let newPosts = parsePosts(from: data).sorted { $0.id > $1.id } + let cacheEntry = BooruPageCacheEntry(posts: newPosts, timestamp: Date()) + pageCache.setObject(cacheEntry, forKey: cacheKey) updatePosts(newPosts, replace: replace) } catch { if (error as? URLError)?.code != .cancelled { debugPrint("fetchPosts: \(error)") } @@ -74,6 +94,10 @@ class BooruManager: ObservableObject { } } + func clearPageCache() { + pageCache.removeAllObjects() + } + func performSearch(settings: SettingsManager? = nil) { settings?.appendToSearchHistory( BooruSearchQuery(provider: settings!.preferredBooru, tags: tags, searchedAt: Date()) diff --git a/Sora/Data/Booru/BooruPageCacheEntry.swift b/Sora/Data/Booru/BooruPageCacheEntry.swift new file mode 100644 index 0000000..1406ed2 --- /dev/null +++ b/Sora/Data/Booru/BooruPageCacheEntry.swift @@ -0,0 +1,14 @@ +import Foundation + +class BooruPageCacheEntry { + let posts: [BooruPost] + let timestamp: Date + var isExpired: Bool { + Date().timeIntervalSince(timestamp) > 300 + } + + init(posts: [BooruPost], timestamp: Date) { + self.posts = posts + self.timestamp = timestamp + } +} |