diff options
Diffstat (limited to 'Sora/Data/Booru/BooruManager.swift')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 43 |
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() } |