summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-03-03 19:57:18 -0800
committerFuwn <[email protected]>2025-03-03 19:57:18 -0800
commit0190ea111951ea4059b0b83f28fbabd8ef3b1a4b (patch)
tree76d011e1180404d4a151c87ba09ffff0b467c7ca
parentfeat: Development commit (diff)
downloadsora-testing-0190ea111951ea4059b0b83f28fbabd8ef3b1a4b.tar.xz
sora-testing-0190ea111951ea4059b0b83f28fbabd8ef3b1a4b.zip
feat: Development commit
-rw-r--r--Sora/Data/Booru/BooruManager.swift24
-rw-r--r--Sora/Data/Booru/BooruPageCacheEntry.swift14
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
+ }
+}