NSThread плюс тикерная анимация - PullRequest
0 голосов
/ 14 января 2010

У меня есть вопрос, на который мы могли бы ответить вместе, у меня в приложении для iphone есть тикертап (например, эти стикеры), и я использую NSThread, чтобы держать память подальше от основного потока, чтобы приложение не замедляло работу. Теперь дело в том, что он делает свою работу хорошо, но когда я прокручиваю UITableView, который у меня есть в том же виде, я замечаю, что моя анимация тикера перестает работать.

ViewController.m (Основной вид этого объекта имеет ленту тикеров)

-(void)startTicker {
  [NSThread detachNewThreadSelector:@selector(start) toTarget:ticker withObject:nil];
}

TickerView.c (это обрабатывает анимацию тикерной ленты)

// Called from the viewcontroller

-(void) start {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self performSelectorOnMainThread:@selector(loop) withObject:nil waitUntilDone:YES];
        [pool release];
}

-(void)loop {
timerHandle = [NSTimer scheduledTimerWithTimeInterval:.01f target:self selector:@selector(render) userInfo:nil repeats:YES];
}

-(void) render {
   // Does a *** load of calculations here and moves the items in the tickertape..
}

Мой вопрос: как я могу запретить UITableview или любому другому событию view / touch заблокировать этот поток от обновления анимации тикерной ленты?.

1 Ответ

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

Ваш NSTimer работает не в фоновом потоке, а в основном потоке. Он будет блокироваться каждый раз, когда в главном потоке запускается что-то еще. -performSelectorOnMainThread: означает, что все, что делается в вызываемом методе, будет выполняться в основном потоке.

Чтобы сделать ваш цикл действительно независимым от основного потока, вы можете настроить цикл while внутри вашего метода start, который будет спать в течение определенного интервала на каждом проходе, а затем вызывать ваш метод render. Вам нужно убедиться, что все обновления пользовательского интерфейса в вашем методе рендеринга выполняются в главном потоке, но для этих вызовов метода сделайте waitUntilDone NO. Я также сделал это с помощью NSOperations, где, когда одна операция заканчивается, я добавляю другую в очередь.

Кроме того, выполнение этой операции рендеринга 100 раз в секунду является чрезмерным. Я бы немного отступил, или даже лучше, взглянул на использование Core Animation для тикера, чтобы сделать ваш рисунок более эффективным.

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