How to Wait in Objective-C and Swift
You can use
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
or if you want to display it periodically, check the NSTimer
class.
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
}
Grand Central Dispatch has a helper function dispatch_after()
for performing operations after a delay that can be quite helpful. You can specify the amount of time to wait before execution, and the dispatch_queue_t
instance to run on. You can use dispatch_get_main_queue()
to execute on the main (UI) thread.
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// do something
});
In Swift 3, the above example can be written as:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// do something
}