From cae0093bfb3f65ff4ed9a7879b0dc2f406794c2c Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 18 Feb 2026 12:37:24 -0800 Subject: perf: memoize post grid derived collections and remove columns cache --- Sora/Views/Post/Grid/PostGridView.swift | 130 +++++++++++++++----------------- 1 file changed, 59 insertions(+), 71 deletions(-) (limited to 'Sora/Views') diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index 9c24932..03e5575 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -1,7 +1,6 @@ // swiftlint:disable file_length import SwiftUI -import WaterfallGrid struct PostGridView: View { // swiftlint:disable:this type_body_length @EnvironmentObject var settings: SettingsManager @@ -9,11 +8,9 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @State private var isSearchHistoryPresented = false @Binding var selectedTab: Int @State private var isSearchablePresented = false - @State private var cachedSuggestions: [Either] = [] @State private var suppressNextSearchSubmit = false @State private var searchTask: Task? @State private var suggestions: [BooruTag] = [] - @State private var cachedColumnsData: ColumnsDataCache? let initialTag: String? @Binding var navigationPath: NavigationPath @State private var localPosts: [BooruPost] = [] @@ -25,6 +22,9 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @State private var hasAppearedBefore = false @State private var currentLocalTask: Task? @State private var previousNavigationPathCount = 0 + @State private var displayedPosts: [BooruPost] = [] + @State private var displayedColumnsData: [[BooruPost]] = [] + @State private var folderHierarchy = FolderHierarchy(folders: []) init( selectedTab: Binding, navigationPath: Binding, initialTag: String? = nil @@ -37,14 +37,38 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @Environment(\.isSearching) private var isSearching - private var activePosts: [BooruPost] { - let posts = initialTag != nil ? localPosts : manager.posts + private var isLoading: Bool { + initialTag != nil ? localIsLoading : manager.isLoading + } - return posts.filter { settings.displayRatings.contains($0.rating) } + private func currentPostsSource() -> [BooruPost] { + initialTag != nil ? localPosts : manager.posts } - private var isLoading: Bool { - initialTag != nil ? localIsLoading : manager.isLoading + private func refreshFolderHierarchy() { + folderHierarchy = FolderHierarchy(folders: settings.folders) + } + + private func columnsData( + for posts: [BooruPost], columnCount: Int + ) -> [[BooruPost]] { + (0.. { @@ -70,7 +94,7 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length ) } - if activePosts.isEmpty, isLoading { + if displayedPosts.isEmpty, isLoading { placeholderGrid } else { gridView(columnCount: settings.thumbnailGridColumns) @@ -98,67 +122,14 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @ViewBuilder private func gridView(columnCount: Int) -> some View { - if settings.alternativeThumbnailGrid { - let columnsData = getColumnsData(columnCount: columnCount) - - HStack(alignment: .top) { - ForEach(0.. [[BooruPost]] { - if let cached = cachedColumnsData, - cached - == ColumnsDataCache( - data: cached.data, - columnCount: columnCount, - posts: activePosts - ) - { - return cached.data - } - - let computedData = (0..