diff options
| author | Fuwn <[email protected]> | 2025-06-18 04:18:12 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-18 04:18:12 -0700 |
| commit | d4ab6da2541e2dcb325590c2ed347413384cb802 (patch) | |
| tree | 0f4c574e96cc6ba793b7d244ea4da474eb1f7b23 /Sora/Data/Booru/BooruManager.swift | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-d4ab6da2541e2dcb325590c2ed347413384cb802.tar.xz sora-testing-d4ab6da2541e2dcb325590c2ed347413384cb802.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Data/Booru/BooruManager.swift')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index f0cad76..b7347a0 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -2,7 +2,7 @@ import Alamofire import SwiftUI @MainActor -class BooruManager: ObservableObject { +class BooruManager: ObservableObject { // swiftlint:disable:this type_body_length // MARK: - Published Properties @Published var posts: [BooruPost] = [] @Published var allTags: [BooruTag] = [] @@ -93,11 +93,20 @@ class BooruManager: ObservableObject { do { let data = try await requestURL(url) - let newPosts = parsePosts(from: data).sorted { $0.id > $1.id } + let newPosts = await withCheckedContinuation { continuation in + DispatchQueue.global(qos: .userInitiated).async { + let parsedPosts = self.parsePosts(from: data).sorted { $0.id > $1.id } + + continuation.resume(returning: parsedPosts) + } + } let cacheEntry = BooruPageCacheEntry(posts: newPosts, timestamp: Date()) pageCache.setObject(cacheEntry, forKey: cacheKey) - updatePosts(newPosts, replace: replace) + + withAnimation(nil) { + updatePosts(newPosts, replace: replace) + } } catch { self.error = error @@ -281,12 +290,28 @@ class BooruManager: ObservableObject { endOfData = newPosts.isEmpty - if !endOfData { - posts += newPosts + guard !endOfData else { return } - postIndexMap.merge( - Dictionary(uniqueKeysWithValues: newPosts.enumerated().map { ($0.element.id, $0.offset) }) - ) { _, new in new } + Task.detached { + let batchSize = 10 + + for chunk in newPosts.chunked(into: batchSize) { + try? await Task.sleep(nanoseconds: 30_000_000) // 30 ms + + await MainActor.run { + withTransaction(Transaction(animation: nil)) { + self.posts += chunk + + self.postIndexMap.merge( + Dictionary( + uniqueKeysWithValues: chunk.enumerated().map { post in + (post.element.id, post.offset) + } + ) + ) { _, newIndex in newIndex } + } + } + } } } |