summaryrefslogtreecommitdiff
path: root/Sora/Data/Booru/BooruManager.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Data/Booru/BooruManager.swift')
-rw-r--r--Sora/Data/Booru/BooruManager.swift43
1 files changed, 42 insertions, 1 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift
index 45a2240..00fb3d1 100644
--- a/Sora/Data/Booru/BooruManager.swift
+++ b/Sora/Data/Booru/BooruManager.swift
@@ -21,6 +21,14 @@ class BooruManager: ObservableObject {
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
}
+ private var tagsCacheFileURL: URL? {
+ guard let directory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first
+ else {
+ return nil
+ }
+
+ return directory.appendingPathComponent("\(provider)_tags.json")
+ }
#if os(macOS)
@Published var selectedPost: BooruPost?
@@ -29,6 +37,7 @@ class BooruManager: ObservableObject {
init(_ provider: BooruProvider) {
self.provider = provider
+ loadCachedTags()
fetchAllTags()
}
@@ -103,7 +112,7 @@ class BooruManager: ObservableObject {
}
}
- func fetchAllTags(limit: Int = 100_000) {
+ func fetchAllTags(limit: Int = 0) {
Task {
guard let url = urlForTags(limit: limit) else { return }
@@ -114,6 +123,7 @@ class BooruManager: ObservableObject {
DispatchQueue.main.async {
self.allTags = BooruTagXMLParser(data: data).parse().sorted { $0.count > $1.count }
+ self.saveTagsToCache()
}
} catch {
if (error as? URLError)?.code != .cancelled {
@@ -170,6 +180,37 @@ class BooruManager: ObservableObject {
}
}
+ private func saveTagsToCache() {
+ guard let url = tagsCacheFileURL else { return }
+
+ do {
+ let data = try JSONEncoder().encode(allTags)
+
+ try data.write(to: url)
+ } catch {
+ #if DEBUG
+ print("saveTagsToCache: \(error)")
+ #endif
+ }
+ }
+
+ private func loadCachedTags() {
+ guard let url = tagsCacheFileURL else { return }
+
+ do {
+ let data = try Data(contentsOf: url)
+ let cachedTags = try JSONDecoder().decode([BooruTag].self, from: data)
+
+ DispatchQueue.main.async {
+ self.allTags = cachedTags
+ }
+ } catch {
+ #if DEBUG
+ print("loadCachedTags: \(error)")
+ #endif
+ }
+ }
+
deinit {
currentTask?.cancel()
}