diff --git a/Signal/src/ViewControllers/HomeView/ConversationSearchViewController.swift b/Signal/src/ViewControllers/HomeView/ConversationSearchViewController.swift index f3874eca8..2039b8372 100644 --- a/Signal/src/ViewControllers/HomeView/ConversationSearchViewController.swift +++ b/Signal/src/ViewControllers/HomeView/ConversationSearchViewController.swift @@ -13,7 +13,7 @@ class ConversationSearchViewController: UITableViewController { SwiftAssertIsOnMainThread(#function) // Use a slight delay to debounce updates. - refreshSearchResults(delay: 0.25) + refreshSearchResults() } } @@ -64,7 +64,7 @@ class ConversationSearchViewController: UITableViewController { @objc internal func yapDatabaseModified(notification: NSNotification) { SwiftAssertIsOnMainThread(#function) - refreshSearchResults(delay: 1.0) + refreshSearchResults() } // MARK: UITableViewDelegate @@ -257,16 +257,26 @@ class ConversationSearchViewController: UITableViewController { var refreshTimer: Timer? - private func refreshSearchResults(delay: TimeInterval) { + private func refreshSearchResults() { SwiftAssertIsOnMainThread(#function) + guard !searchResultSet.isEmpty else { + // To avoid incorrectly showing the "no results" state, + // always search immediately if the current result set is empty. + refreshTimer?.invalidate() + refreshTimer = nil + + updateSearchResults(searchText: searchText) + return + } + if refreshTimer != nil { // Don't start a new refresh timer if there's already one active. return } refreshTimer?.invalidate() - refreshTimer = WeakTimer.scheduledTimer(timeInterval: delay, target: self, userInfo: nil, repeats: false) { [weak self] _ in + refreshTimer = WeakTimer.scheduledTimer(timeInterval: 0.1, target: self, userInfo: nil, repeats: false) { [weak self] _ in guard let strongSelf = self else { return }