Проблемы с запуском NSTimer из вторичного потока - PullRequest
1 голос
/ 19 января 2010

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

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

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

Ответы [ 4 ]

2 голосов
/ 19 января 2010

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

-(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 голос
/ 19 августа 2010

Джон Франклин ответ правильный .. но когда вы вызываете метод

scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

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

1 голос
/ 19 января 2010

Я нашел эту страницу с некоторым исходным кодом для запуска NSTimer во вторичном потоке. Вы действительно запускаете runloop в своем коде? Трудно сказать, не видя ваш код, в чем может быть проблема: http://www.iphonedevsdk.com/forum/iphone-sdk-development/22175-nstimer-secondary-thread-will-produce-leaks.html

0 голосов
/ 19 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...