From a70349e971e1b6e31642cd3b2e9b15881395e2f9 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 15 Jun 2025 05:22:14 -0700 Subject: feat: Development commit --- Sora/Data/Booru/BooruManager.swift | 52 +++++++++------------- Sora/Views/Generic/GenericListView.swift | 9 +++- Sora/Views/MainView.swift | 24 +++++----- .../Details/Carousel/PostDetailsCarouselView.swift | 4 +- Sora/Views/Post/Details/PostDetailsTagsView.swift | 5 ++- Sora/Views/Post/Grid/PostGridThumbnailView.swift | 4 +- Sora/Views/Post/Grid/PostGridView.swift | 32 ++++++++----- 7 files changed, 70 insertions(+), 60 deletions(-) diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 1abc7b6..12d96f0 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -66,7 +66,8 @@ class BooruManager: ObservableObject { updateTagsCacheSize() } - func fetchPosts(page: Int = 1, limit: Int = 100, tags: [String] = [], replace: Bool = false) { + func fetchPosts(page: Int = 1, limit: Int = 100, tags: [String] = [], replace: Bool = false) async + { guard !isLoading, let url = urlForPosts(page: flavor == .gelbooru ? page - 1 : page, limit: limit, tags: tags) else { return } @@ -87,32 +88,25 @@ class BooruManager: ObservableObject { isLoading = true - cancelCurrentTask() - - currentTask = Task { - defer { isLoading = false } - - do { - let data = try await requestURL(url) - - guard !Task.isCancelled else { return } + do { + let data = try await requestURL(url) + let newPosts = parsePosts(from: data).sorted { $0.id > $1.id } + let cacheEntry = BooruPageCacheEntry(posts: newPosts, timestamp: Date()) - 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 { - debugPrint("BooruManager.fetchPosts: \(error)") - } + pageCache.setObject(cacheEntry, forKey: cacheKey) + updatePosts(newPosts, replace: replace) + } catch { + debugPrint("BooruManager.fetchPosts: \(error)") } + + isLoading = false } func clearCachedPages() { pageCache.removeAllObjects() } - func performSearch(settings: SettingsManager? = nil) { + func performSearch(settings: SettingsManager? = nil) async { if searchHistory.last?.tags == tags { return } if historyIndex < searchHistory.count - 1 { @@ -132,24 +126,22 @@ class BooruManager: ObservableObject { searchText = tags.joined(separator: " ") - cancelCurrentTask() - fetchPosts(page: 1, tags: tags, replace: true) + await fetchPosts(page: 1, tags: tags, replace: true) } - func loadNextPage() { + func loadNextPage() async { guard !isLoading else { return } - Task { - currentPage += 1 + currentPage += 1 - fetchPosts(page: currentPage, tags: tags) + await fetchPosts(page: currentPage, tags: tags) - if historyIndex >= 0 && historyIndex < searchHistory.count { - var currentQuery = searchHistory[historyIndex] + if historyIndex >= 0 && historyIndex < searchHistory.count { + var currentQuery = searchHistory[historyIndex] - currentQuery.page = currentPage - searchHistory[historyIndex] = currentQuery - } + currentQuery.page = currentPage + + searchHistory[historyIndex] = currentQuery } } diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift index 3825454..24d25e8 100644 --- a/Sora/Views/Generic/GenericListView.swift +++ b/Sora/Views/Generic/GenericListView.swift @@ -268,7 +268,9 @@ struct GenericListView: View { // swi selectedTab = 0 if previousProvider == settings.preferredBooru { - manager.performSearch(settings: settings) + Task(priority: .userInitiated) { + await manager.performSearch(settings: settings) + } } if !allowBookmarking { @@ -288,7 +290,10 @@ struct GenericListView: View { // swi manager.searchText += " \(item.tags.joined(separator: " "))" manager.selectedPost = nil - manager.performSearch(settings: settings) + Task(priority: .userInitiated) { + await manager.performSearch(settings: settings) + } + isPresented.toggle() }) { Label("Add to Search", systemImage: "plus") diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index 4e46234..c3a8c66 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -78,13 +78,13 @@ struct MainView: View { manager = BooruManager(provider) manager.searchText = previousSearchText - Task { - refreshTags() + refreshTags() + Task(priority: .userInitiated) { if manager.searchText.isEmpty { - manager.fetchPosts() + await manager.fetchPosts() } else { - manager.performSearch(settings: settings) + await manager.performSearch(settings: settings) } } } @@ -92,22 +92,20 @@ struct MainView: View { private func initializeManager() { manager = BooruManager(settings.preferredBooru) - Task { - refreshTags() + refreshTags() + Task(priority: .userInitiated) { if manager.posts.isEmpty { - manager.fetchPosts() + await manager.fetchPosts() } } } private func refreshTags() { - Task { - if settings.searchSuggestionsMode != .disabled { - manager.initializeTags() - } else { - manager.updateTagsCacheSize() - } + if settings.searchSuggestionsMode != .disabled { + manager.initializeTags() + } else { + manager.updateTagsCacheSize() } } } diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift index 4452b22..52377b2 100644 --- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift +++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift @@ -52,7 +52,9 @@ struct PostDetailsCarouselView: View { } } .onChange(of: currentIndex) { - if currentIndex == posts.count - 1 { manager.loadNextPage() } + Task(priority: .utility) { + if currentIndex == posts.count - 1 { await manager.loadNextPage() } + } manager.selectedPost = posts[currentIndex] diff --git a/Sora/Views/Post/Details/PostDetailsTagsView.swift b/Sora/Views/Post/Details/PostDetailsTagsView.swift index 7e603b4..8ff4a9f 100644 --- a/Sora/Views/Post/Details/PostDetailsTagsView.swift +++ b/Sora/Views/Post/Details/PostDetailsTagsView.swift @@ -53,7 +53,10 @@ struct PostDetailsTagsView: View { private func search() { manager.selectedPost = nil - manager.performSearch(settings: settings) + Task(priority: .userInitiated) { + await manager.performSearch(settings: settings) + } + isPresented.toggle() } } diff --git a/Sora/Views/Post/Grid/PostGridThumbnailView.swift b/Sora/Views/Post/Grid/PostGridThumbnailView.swift index f614046..fd4ae62 100644 --- a/Sora/Views/Post/Grid/PostGridThumbnailView.swift +++ b/Sora/Views/Post/Grid/PostGridThumbnailView.swift @@ -44,9 +44,7 @@ struct PostGridThumbnailView: View { imageContent(image: image) .onScrollVisibilityChange { visible in if post == posts.last, !manager.endOfData, visible { - Task { - manager.loadNextPage() - } + Task(priority: .utility) { await manager.loadNextPage() } } } } else { diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index 4aa4b39..117da87 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -69,14 +69,16 @@ struct PostGridView: View { return } - manager.performSearch(settings: settings) + Task(priority: .userInitiated) { + await manager.performSearch(settings: settings) + } } .navigationDestination(for: BooruPost.self) { post in PostDetailsView(post: post) } .onChange(of: isSearchablePresented) { _, isPresented in if !isPresented, manager.searchText.isEmpty, !manager.isNavigatingHistory { - manager.performSearch() + Task(priority: .userInitiated) { await manager.performSearch() } } } .onChange(of: manager.posts) { _, newPosts in @@ -105,11 +107,13 @@ struct PostGridView: View { manager.posts = [] manager.currentPage = 1 - manager.fetchPosts( - page: 1, - tags: manager.searchHistory[newIndex].tags, - replace: true - ) + Task(priority: .userInitiated) { + await manager.fetchPosts( + page: 1, + tags: manager.searchHistory[newIndex].tags, + replace: true + ) + } } } .toolbar { @@ -144,7 +148,13 @@ struct PostGridView: View { } PlatformSpecificToolbarItem { - Button(action: { Task { manager.loadNextPage() } }) { + Button( + action: { + Task(priority: .userInitiated) { + await manager.loadNextPage() + } + } + ) { Label( "Manually Load Next Page", systemImage: "arrow.down.to.line" @@ -176,9 +186,11 @@ struct PostGridView: View { .navigationTitle("Posts") .refreshable { manager.clearCachedPages() - manager.fetchPosts(page: 1, tags: manager.tags, replace: true) + + Task(priority: .userInitiated) { + await manager.fetchPosts(page: 1, tags: manager.tags, replace: true) + } } - .scrollDisabled(manager.isLoading) .sheet(isPresented: $isSearchHistoryPresented) { PostGridSearchHistoryView( selectedTab: $selectedTab, -- cgit v1.2.3