NSTimer в подклассе NSOperation - PullRequest
       4

NSTimer в подклассе NSOperation

0 голосов
/ 02 февраля 2011

Уважаемое сообщество. Я пытаюсь настроить NSTimer:

@interface GetExternalInfo : NSOperation {

NSTimer *keepAliveTimerMain;

@property (nonatomic,retain) NSTimer *keepAliveTimerMain;

.m:

@synthesize keepAliveTimerMain

-(void) main;
{
self.keepAliveTimerMain = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(keepAlive:) userInfo:nil repeats:YES];
[keepAliveTimerMain fire];
[[NSRunLoop currentRunLoop] addTimer:self.keepAliveTimerMain forMode: NSDefaultRunLoopMode];

BOOL timerState = [keepAliveTimerMain isValid];
NSLog(@"STAT:Timer Validity is: %@", timerState?@"YES":@"NO");


- (void)keepAlive:(NSTimer *)theTimer
{
    BOOL currentState = [self isCancelled];
    NSLog(@"STAT:cancelled state is %@.\n",currentState?@"YES":@"NO");
}

В логах

2011-02-02 18: 58: 31.041 снег [54705: 5d07] STAT: состояние отменено нет. 2011-02-02 18: 58: 31.042 снег [54705: 5d07] STAT: таймер это: ДА

Я вижу это только один раз. Нет повторных попыток каждые 5 секунд какие мнения по этому делу? GC включен.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

У вас есть runloop в текущем потоке?Таймер нуждается в runloop, чтобы иметь возможность стрелять.Я заметил, что вы звоните -fire вручную, что объясняет, почему -keepAlive вызывается, но на самом деле это не запускает таймер.

1 голос
/ 02 февраля 2011

Вам нужно добавить свой таймер в цикл выполнения, что-то вроде [[NSRunLoop currentRunLoop] addTimer:keepAliveTimerMain forMode: NSDefaultRunLoopMode];.

РЕДАКТИРОВАТЬ: Код, который вы опубликовали, показывает, что вы вручную запускаете таймер до , добавляя его в цикл запуска. Это сработает и сделает недействительным таймер, так что вы фактически пытаетесь запланировать недопустимый таймер в цикле выполнения. Вот почему вы видите сообщение NSLog только один раз.

...