From c0e9f283984fe1dc335e310dd0fa90b9f67cb259 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 20 Jul 2020 17:04:12 -0500 Subject: [PATCH] Do a synchronous fetch of the timeline data on macOS --- .../Shared/Timeline/TimelineModel.swift | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Multiplatform/Shared/Timeline/TimelineModel.swift b/Multiplatform/Shared/Timeline/TimelineModel.swift index f2f265827..b244a2444 100644 --- a/Multiplatform/Shared/Timeline/TimelineModel.swift +++ b/Multiplatform/Shared/Timeline/TimelineModel.swift @@ -485,9 +485,29 @@ private extension TimelineModel { } resetReadFilter() + + #if os(macOS) + fetchAndReplaceArticlesSync() + #else fetchAndReplaceArticlesAsync() + #endif } + func fetchAndReplaceArticlesSync() { + // To be called when the user has made a change of selection in the sidebar. + // It blocks the main thread, so that there’s no async delay, + // so that the entire display refreshes at once. + // It’s a better user experience this way. + var fetchers = feeds as [ArticleFetcher] + if let fetcher = exceptionArticleFetcher { + fetchers.append(fetcher) + exceptionArticleFetcher = nil + } + + let fetchedArticles = fetchUnsortedArticlesSync(for: fetchers) + replaceArticles(with: fetchedArticles) + } + func fetchAndReplaceArticlesAsync() { var fetchers = feeds as [ArticleFetcher] if let fetcher = exceptionArticleFetcher { @@ -505,6 +525,28 @@ private extension TimelineModel { fetchRequestQueue.cancelAllRequests() } + func fetchUnsortedArticlesSync(for representedObjects: [Any]) -> Set
{ + cancelPendingAsyncFetches() + let articleFetchers = representedObjects.compactMap{ $0 as? ArticleFetcher } + if articleFetchers.isEmpty { + return Set
() + } + + var fetchedArticles = Set
() + for articleFetcher in articleFetchers { + if isReadFiltered ?? true { + if let articles = try? articleFetcher.fetchUnreadArticles() { + fetchedArticles.formUnion(articles) + } + } else { + if let articles = try? articleFetcher.fetchArticles() { + fetchedArticles.formUnion(articles) + } + } + } + return fetchedArticles + } + func fetchUnsortedArticlesAsync(for representedObjects: [Any], completion: @escaping ArticleSetBlock) { // The callback will *not* be called if the fetch is no longer relevant — that is, // if it’s been superseded by a newer fetch, or the timeline was emptied, etc., it won’t get called.