From c8fa1b71d909b707553c22fd26443363920bf303 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 17 Feb 2018 15:29:55 -0800 Subject: [PATCH] Create and use a fetchAndMergeArticlesQueue (coalescing queue) for TimelineViewController. --- .../MainWindow/MainWindowController.swift | 2 +- .../Timeline/TimelineViewController.swift | 62 +++++++------------ 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index 28a2b7195..120480fdd 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -132,7 +132,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { // MARK: Toolbar - @objc func makeToolbarValidate(_ sender: Any?) { + @objc func makeToolbarValidate() { window?.toolbar?.validateVisibleItems() } diff --git a/Evergreen/MainWindow/Timeline/TimelineViewController.swift b/Evergreen/MainWindow/Timeline/TimelineViewController.swift index a6234511f..5aa2ee86d 100644 --- a/Evergreen/MainWindow/Timeline/TimelineViewController.swift +++ b/Evergreen/MainWindow/Timeline/TimelineViewController.swift @@ -57,7 +57,7 @@ class TimelineViewController: NSViewController, UndoableCommandRunner { } private var didRegisterForNotifications = false - private var fetchAndMergeArticlesTimer: Timer? + static let fetchAndMergeArticlesQueue = CoalescingQueue(name: "Fetch and Merge Articles", interval: 0.5) private var sortDirection = AppDefaults.shared.timelineSortDirection { didSet { @@ -451,6 +451,28 @@ class TimelineViewController: NSViewController, UndoableCommandRunner { rowHeightWithoutFeedName = calculateRowHeight(showingFeedNames: false) updateTableViewRowHeight() } + + @objc func fetchAndMergeArticles() { + + guard let representedObjects = representedObjects else { + return + } + + performBlockAndRestoreSelection { + + var unsortedArticles = fetchUnsortedArticles(for: representedObjects) + + // Merge articles by articleID. For any unique articleID in current articles, add to unsortedArticles. + let unsortedArticleIDs = unsortedArticles.articleIDs() + for article in articles { + if !unsortedArticleIDs.contains(article.articleID) { + unsortedArticles.insert(article) + } + } + + updateArticles(with: unsortedArticles) + } + } } // MARK: NSUserInterfaceValidations @@ -690,28 +712,6 @@ private extension TimelineViewController { return fetchedArticles } - func fetchAndMergeArticles() { - - guard let representedObjects = representedObjects else { - return - } - - performBlockAndRestoreSelection { - - var unsortedArticles = fetchUnsortedArticles(for: representedObjects) - - // Merge articles by articleID. For any unique articleID in current articles, add to unsortedArticles. - let unsortedArticleIDs = unsortedArticles.articleIDs() - for article in articles { - if !unsortedArticleIDs.contains(article.articleID) { - unsortedArticles.insert(article) - } - } - - updateArticles(with: unsortedArticles) - } - } - func selectArticles(_ articleIDs: [String]) { let indexesToSelect = articles.indexesForArticleIDs(Set(articleIDs)) @@ -722,23 +722,9 @@ private extension TimelineViewController { tableView.selectRowIndexes(indexesToSelect, byExtendingSelection: false) } - func invalidateFetchAndMergeArticlesTimer() { - - if let timer = fetchAndMergeArticlesTimer { - if timer.isValid { - timer.invalidate() - } - fetchAndMergeArticlesTimer = nil - } - } - func queueFetchAndMergeArticles() { - invalidateFetchAndMergeArticlesTimer() - fetchAndMergeArticlesTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { (timer) in - self.fetchAndMergeArticles() - self.invalidateFetchAndMergeArticlesTimer() - } + TimelineViewController.fetchAndMergeArticlesQueue.add(self, #selector(fetchAndMergeArticles)) } func representedObjectArraysAreEqual(_ objects1: [AnyObject]?, _ objects2: [AnyObject]?) -> Bool {