запуск iphone NStimer через 2 секунды - PullRequest
6 голосов
/ 07 мая 2010

Я пытаюсь запустить блок кода через 2 секунды после его запуска.

Я думаю, что NSTimer может сделать это, но не может понять это.

Ответы [ 4 ]

19 голосов
/ 07 мая 2010

NSTimer можно использовать, но другой вариант - использовать executeSelector: withObject: afterDelay: Это в основном похоже на вызов метода (отправка сообщения), который происходит позже.

В этом примере будет отправлено сообщение doStuff: после задержки:

[self performSelector:@selector(doStuff:) withObject:self afterDelay:2];

, в результате чего этот метод будет вызван через 2,0 секунды:

-(void)doStuff:(id)sender 
{
    /// do something
}
11 голосов
/ 07 мая 2010

Следующее будет делать то, что вам нужно:

 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 2 
                                   target:self 
                                   selector:@selector(handleTimer:) 
                                   userInfo:nil
                                   repeats:NO];

Тогда функция делегата:

-(void)handleTimer: (NSTimer *) timer 
{       
   //code
}
8 голосов
/ 20 июля 2011

Вы также можете использовать удобный код:

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

Затем просто импортируйте NSObject + PerformBlock.h и вызовите:

[myObject performBlock:^{
    // Code you want to perform after 2secs
} afterDelay:2];
2 голосов
/ 07 мая 2010

Вы должны иметь возможность установить NSTimeInterval на 2,0 секунды, и оно должно срабатывать через это время. Что вы видите? Какой код вы используете для вызова таймера?

...