2010-01-19 3 views
1

Я заметил в своем коде, что, когда я пытаюсь запустить NSTimer из вторичного потока, он не работает. Я попробовал позвонить + [NSRunLoop currentRunLoop] на всякий случай, если проблема была в том, что в потоке не было цикла запуска ... но без кубиков. (Обратите внимание, что это был выстрел в темноте. Документы сказали, что создадут цикл выполнения, но, возможно, есть другая конфигурация, которую мне нужно было сделать, и не делал этого.)Проблемы с запуском NSTimer из вторичного потока

Я знаю о звонках типа - [NSObject performSelectorOnMainThread:], который мог бы решить мою проблему (на самом деле, моим решением было просто переместить этот код в основной поток, который отлично работает), но мне все еще интересно, почему эта проблема возникла. На самом деле невозможно запустить NSTimer из вторичного потока? Есть ли обходной путь?

Большое спасибо.

+0

Спасибо всем ... У меня не будет времени попробовать это позже позже, но я не думаю, что я начинаю свой цикл запуска должным образом. –

+0

Да, это была проблема: я не звонил [runLoop run]. Спасибо за помощь. –

ответ

0

Удостоверьтесь, что вы A) добавили таймер в текущую рабочую зону, а B) запустили runloop. Когда ваш таймер срабатывает, если вы хотите выйти из вызова [runloop run], вызовите [runloop stop].

2

Следующий сегмент кода работает для меня.

-(id)init { 
    myWorkerThread = [[NSThread alloc]initWithTarget:self selector:@selector(workerThread) object:nil]; 
    [myWorkerThread start]; 
} 

#pragma mark WorkerThread Support 
-(void)stillWorking { 
    NSLog(@"Still working..."); 
} 

-(void)workerThread { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    NSTimer *threadTimer = [NSTimer scheduledTimerWithTimeInterval:10 
           target:self 
           selector:@selector(stillWorking) 
           userInfo:nil 
           repeats:YES]; 

    [[NSRunLoop currentRunLoop] addTimer:threadTimer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 

    [pool drain]; 
} 
1

Джон Франклин Ответ correct..but при вызове метода

scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

он автоматически назначает таймер на текущем NSRunLoop. Поэтому вам не нужно снова добавлять таймер в текущий цикл выполнения, вы можете вызвать только метод [[NSRunLoop currentRunLoop] run].