Swift version: 5.0
You can make a method call run after a number of seconds have elapsed using
perform(_:withObject:afterDelay:), like this:
perform(#selector(yourMethodHere), with: nil, afterDelay: 1)
However, what if you change your mind, and decide you don't want
yourMethodHere() to be called? As long as you act before that timer expires, you have two options: cancel that specific delayed call, or cancel all delayed calls.
To cancel that specific method call, you need to use the method
NSObject. Provide it with a target (where the method was going to be called), as well as the same selector and object you used when calling
perform(), and it will cancel that delayed call.
// set up a delayed call… perform(#selector(yourMethodHere), with: nil, afterDelay: 1) // …then immediately cancel it NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(yourMethodHere), object: nil)
Being able to filter the cancellation by both selector and object means you can be very specific: "cancel the printing call for this filename."
If you've made a number of delayed calls and want to cancel them all – very helpful if you're about to leave a view controller, for example, and want to abandon any queued work – you can use this method call instead:
That will cancel every call that was queued up on
self, regardless of which selectors and objects were used.
If you're making delayed calls on a specific object, just use that object in place of
self. For example:
myObj.perform(#selector(yourMethodHere), with: nil, afterDelay: 1) NSObject.cancelPreviousPerformRequests(withTarget: myObj, selector: #selector(yourMethodHere), object: nil)
Available from iOS 4.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.