Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iphone NStimer start in 2 seconds

Tags:

iphone

nstimer

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.

like image 591
Ian Vink Avatar asked May 06 '10 21:05

Ian Vink


3 Answers

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
}
like image 168
progrmr Avatar answered Oct 08 '22 22:10

progrmr


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
}
like image 22
Jason Webb Avatar answered Oct 08 '22 20:10

Jason Webb


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];
like image 20
P.O Avatar answered Oct 08 '22 20:10

P.O