How to trigger a function after certain time once typing ends in Swift?

2+

Hello everyone! Today I am going to show you how you can trigger a method after certain duration which executes only after you stop typing. Well, you might think there is a delegate method provided by UITextFieldDelegate as func textFieldDidEndEditing(_ textField: UITextField). But this method executes only after the keyboard is dismissed. So, what if we want to execute a method after certain time while the typing is stopped? Well, let me tell you the secret. 😎

While doing online search we normally use UISearchBar. But it is not good idea to send server request either using searchBarTextDidEndEditing nor textDidChange methods provided by UISearchBarDelegate. If didEndEditing is used, only after keyboard is dismissed, the request can be executed. And if textDidChange is used, each and every time after the key is pressed, a server request is made. Both approach is not good.

Solution

extension NSObject {
    
    func smSearch(text: String, action: Selector, afterDelay: Double = 0.5) {
        NSObject.cancelPreviousPerformRequests(withTarget: self)
        perform(action, with: text, afterDelay: afterDelay)
    }
    
}

Once you add this extension in your project, you can call this method from all class which inherits NSObject class. UIViewController is also one of them. So, you can use this function within your viewController class. Here is an example of how you can use it.

extension YourViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        smSearch(text: searchText, action: #selector(delaySearch(with:)), afterDelay: 0.5)
    }
    
    @objc func delaySearch(with: String) {
        print(with)
    }
}

You can alter afterDelay value to whatever you want. Now after implementing this approach, once typing is done, only after 0.5 second, delaySearch(with:) method will be executed. Isn’t that cool. I hope so.

Well guys and girls, that’s all for today. I really hope, this is helpful to you. Let me know if there is any confusion. I will be happy to reply you back.

Thanks

2+

Leave a Reply

santoshm