How to Wait in Objective-C and Swift
I know I am late to this party. But I found people haven't mention thread sleep. If you are using GCD to call that function. You can use :
NSThread sleepForTimeInterval:2.0f];
to delay the thread for 2 seconds.
[self changeText: @"A text"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Here your non-main thread.
[NSThread sleepForTimeInterval:2.0f];
dispatch_async(dispatch_get_main_queue(), ^{
//Here you returns to main thread.
[self changeText: @"Another text"];
});
});
Edit 2 (Feb 2015)
I think the NSTimer is a great solution. My solution just giving another option to achieve the goal of NSTimer.
Please read: How do I use NSTimer?
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(doSomethingWhenTimeIsUp:)
userInfo:nil
repeats:NO];
In the class, you need this method:
- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
// YES! Do something here!!
}
Edit 3 (May 2016)
In Swift 2.0, you can use this way:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: "doSomethingWhenTimeIsUp:",
userInfo: nil,
repeats: false)
It creates an NSTimer's entity and adds the timer automatically to the NSRunLoop associated with the NSThread in which the timer is created.
Edit 4 (Jun 2016) In Swift 2.2, the way to invoke select is:
#selector(doSomethingWhenTimeIsUp(_:))
So, it is something like:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp()),
userInfo: nil,
repeats: false)
Edit 5 (Oct 2016)
In Swift 3, the way to invoke select is:
#selector(doSomethingWhenTimeIsUp)
So, it is something like:
Timer.scheduledTimer(timeInterval: 2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp),
userInfo: nil,
repeats: false)
Then, the func should looks like this:
@objc private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
Edit 6 (May 2018) In Swift 4, we can do as below way.
let delaySeconds = 2.0
DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
doSomethingWhenTimeIsUp()
}
Then, the func should looks like this:
private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
You can use
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
or if you want to display it periodically, check the NSTimer
class.