Bladeren bron

implement debouncing, implement UISearchResultsUpdating delegate as we do in other VCs for search as well

cyberta 3 jaren geleden
bovenliggende
commit
92d16fc88e
1 gewijzigde bestanden met toevoegingen van 26 en 15 verwijderingen
  1. 26 15
      deltachat-ios/Chat/ChatViewController.swift

+ 26 - 15
deltachat-ios/Chat/ChatViewController.swift

@@ -41,12 +41,14 @@ class ChatViewController: UITableViewController {
     private var isSearchActive: Bool = false
     private var searchMessageIds: [Int] = []
     private var searchResultIndex: Int = 0
+    private var debounceTimer: Timer?
 
     lazy var searchController: UISearchController = {
         let searchController = UISearchController(searchResultsController: nil)
         searchController.obscuresBackgroundDuringPresentation = false
         searchController.searchBar.placeholder = String.localized("search")
         searchController.searchBar.delegate = self
+        searchController.searchResultsUpdater = self
         searchController.searchBar.inputAccessoryView = messageInputBar
         searchController.searchBar.autocorrectionType = .yes
         searchController.searchBar.keyboardType = .default
@@ -1819,26 +1821,35 @@ extension ChatViewController: ChatSearchDelegate {
     }
 }
 
-// MARK: - UISearchBarDelegate
-extension ChatViewController: UISearchBarDelegate {
-    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
-        logger.debug("searchbar: \(searchText)")
-        DispatchQueue.global(qos: .userInteractive).async { [weak self] in
-            guard let self = self else { return }
-            let resultIds = self.dcContext.searchMessages(chatId: self.chatId, searchText: searchText)
-            DispatchQueue.main.async { [weak self] in
+// MARK: UISearchResultUpdating
+extension ChatViewController: UISearchResultsUpdating {
+    func updateSearchResults(for searchController: UISearchController) {
+        logger.debug("searchbar: \(String(describing: searchController.searchBar.text))")
+        debounceTimer?.invalidate()
+        debounceTimer = Timer.scheduledTimer(withTimeInterval: 0.25, repeats: false) { _ in
+            let searchText = searchController.searchBar.text ?? ""
+            DispatchQueue.global().async {
+                let resultIds = self.dcContext.searchMessages(chatId: self.chatId, searchText: searchText)
+                DispatchQueue.main.async { [weak self] in
+
                 guard let self = self else { return }
-                self.searchMessageIds = resultIds
-                self.searchResultIndex = self.searchMessageIds.isEmpty ? 0 : self.searchMessageIds.count - 1
-                self.searchAccessoryBar.isEnabled = !resultIds.isEmpty
-                if let lastId = resultIds.last {
-                    self.scrollToMessage(msgId: lastId)
+                    self.searchMessageIds = resultIds
+                    self.searchResultIndex = self.searchMessageIds.isEmpty ? 0 : self.searchMessageIds.count - 1
+                    self.searchAccessoryBar.isEnabled = !resultIds.isEmpty
+                    self.searchAccessoryBar.updateSearchResult(sum: self.searchMessageIds.count, position: self.searchResultIndex + 1)
+
+                    if let lastId = resultIds.last {
+                        self.scrollToMessage(msgId: lastId, animated: false)
+                    }
+                    self.reloadData()
                 }
-                self.searchAccessoryBar.updateSearchResult(sum: self.searchMessageIds.count, position: self.searchResultIndex + 1)
-                self.reloadData()
             }
         }
     }
+}
+
+// MARK: - UISearchBarDelegate
+extension ChatViewController: UISearchBarDelegate {
 
     func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
         logger.debug("searchbar: searchBarShouldBeginEditing")