I am trying to have a block of code run 2 seconds after I 'start' it.
I think the NSTimer can do this but can't figure it out.
NSTimer can be used, but another option is to use performSelector:withObject:afterDelay: It's basically like a method call (message send) that happens later.
This example will send a doStuff: message after a delay:
[self performSelector:@selector(doStuff:) withObject:self afterDelay:2];
which causes this method to get invoked 2.0 seconds later:
-(void)doStuff:(id)sender 
{
    /// do something
}
The following will do what you need:
 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 2 
                                   target:self 
                                   selector:@selector(handleTimer:) 
                                   userInfo:nil
                                   repeats:NO];
Then the delegate function:
-(void)handleTimer: (NSTimer *) timer 
{       
   //code
}
You can also use some handy code :
NSObject+PerformBlock.h
@interface NSObject (PerformBlock)
- (void)performBlock:(void(^)(void))block waitUntilDone:(BOOL)wait;
- (void)performBlock:(void(^)(void))block afterDelay:(NSTimeInterval)delay;
- (void)performBlock:(void(^)(void))block repeatCount:(NSUInteger)repeatCount timeInteval:(NSTimeInterval)timeInterval;
@end
NSObject+PerformBlock.m
@interface NSObject (PerformBlockHidden)
- (void)performBlock:(void(^)(void))block;
@end
@implementation NSObject (PerformBlock)
- (void)performBlock:(void(^)(void))block {
    block();
}
- (void)performBlock:(void(^)(void))block waitUntilDone:(BOOL)wait {
    [self performSelector:@selector(performBlock:) onThread:nil withObject:[[block copy] autorelease] waitUntilDone:wait];
}
- (void)performBlock:(void(^)(void))block afterDelay:(NSTimeInterval)delay {
    [self performSelector:@selector(performBlock:) withObject:[[block copy] autorelease] afterDelay:delay];
}
- (void)performBlock:(void(^)(void))block repeatCount:(NSUInteger)repeatCount timeInteval:(NSTimeInterval)timeInterval {
    for (NSInteger repetition = 0; repetition < repeatCount; repetition++)
        [self performBlock:block afterDelay:(repetition*timeInterval)];
}
@end
Then just import NSObject+PerformBlock.h and call :
[myObject performBlock:^{
    // Code you want to perform after 2secs
} afterDelay:2];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With