Запуск NSTimer в потоке - PullRequest
       42

Запуск NSTimer в потоке

3 голосов
/ 04 февраля 2010

Я пытаюсь запустить NSTimer в потоке, используя iPhone SDK 3.0. Я думаю, что все делаю правильно (новый runloop и т. Д.). Если я вызываю [timer invalidate] для viewDidDissappear, хотя я получаю эту ошибку:

bool _WebTryThreadLock (bool), 0x3986d60: Пытался получить веб-блокировку из потока, отличного от основного или веб-потока. Это может быть результатом обращения к UIKit из вторичного потока. Грохнуть сейчас ... Программа получила сигнал: «EXC_BAD_ACCESS».

Вот мой код:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [activityIndicator startAnimating];
    NSThread* timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(timerStart) object:nil]; //Create a new thread
    [timerThread start]; //start the thread
}

-(void)timerStart
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    //Fire timer every second to updated countdown and date/time
    timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(method) userInfo:nil repeats:YES] retain];
    [runLoop run];
    [pool release];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [timer invalidate];
}

Когда я удаляю строку, отменяющую таймер, все работает нормально. Я не должен признать его недействительным или я совершаю какую-то другую ошибку?

Спасибо

Ответы [ 3 ]

7 голосов
/ 04 февраля 2010

Попробуйте

[timer performSelector:@selector(invalidate) onThread:timerThread withObject:nil waitUntilDone:NO];

вместо этого. Вам нужно будет сделать timerThread иваром вашего контроллера представления.

2 голосов
/ 19 октября 2012
    - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSThread* timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(timerStart) userInfo:nil repeats:TRUE];
    [timerThread start]; 
    }

    -(void)timerStart
    {
   @autoreleasePool{
    NSRunLoop *TimerRunLoop = [NSRunLoop currentRunLoop];
    [NSTimer scheduleTimerWithInterval:0.1 target:self selector:@selector(methodName:) userInfo:nil repeat:YES];
    [TimerRunLoop run];
    }

    - (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    }
0 голосов
/ 19 июня 2012

Полагаю, вы выполнили некоторую работу с пользовательским интерфейсом в "method".

 timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(method) userInfo:nil repeats:YES] retain];

Судя по журналу, вы проделали работу по обновлению интерфейса в потоке "Таймер" в "методе".

вы можете использовать блок для отправки работы в основном потоке или performSeletorOnMainThread для выполнения "метода"

...