Таймер и анимация - PullRequest
       15

Таймер и анимация

1 голос
/ 31 октября 2008

Я реализовал обработчик нажатия и удержания, используя NSTimer, который я сначала установил в перегрузке TouchesBegan.

Однако, на самом деле, я хочу, чтобы действие выполнялось непрерывно в быстрой последовательности, пока удерживается касание. Итак, по истечении таймера я вызываю обработчик для выполнения работы, который затем устанавливает другой таймер и цикл продолжается до тех пор, пока не придет TouchesEnded и не отменит его или не будет выполнено другое условие завершения.

Это прекрасно работает, пока мой код обработчика не запускает анимацию одновременно. Теперь у нас есть события анимации и события таймера, и во всем, что нам нужно для обработки TouchesEnded.

Что я обнаружил, так это то, что если анимация запущена, и я установил таймер на значение менее 0,025 секунд, мое событие TouchesEnded не наступит, пока цикл таймера не остановится (другое условие завершения). Установите более медленный таймер или не запускайте анимацию, сделайте так, чтобы она работала (сразу же включается TouchedEnded), но это не то, что мне нужно.

Очевидно, это все на устройстве (сборка релиза - нет NSLogs) - в симе все нормально работает

Есть ли способ установить относительную приоритетность этих событий - или, скорее всего, я здесь упускаю что-то еще очевидное?

[Update]

В этом случае я работал над этим, выполняя непрерывную часть без визуальной обратной связи, пока это не будет сделано (что с этой точки зрения пользователей является мгновенным). Я думаю, что сейчас все в порядке. Я все еще хотел бы услышать еще какие-нибудь мысли по этому поводу (идея Джеффри была хорошей), но сейчас я не жду от иголочек.

1 Ответ

1 голос
/ 01 ноября 2008

Попробуйте написать свой собственный класс типа Timer, порождая поток. Пример:

BOOL continue = YES; //outside of your @implementation

-(void)doLoop
{
   while(continue){
      [NSThread sleepForTimeInterval:.025];
      [self performSelectorOnMainThread:@selector(whateverTheFunctionIs) waitUntilDone:YES];
    }
}

и это будет начато [NSThread detatchNewThreadSelector:@selector(doLoop) toTarget:self withObject:nil]. Это не совсем потокобезопасно, но вы можете обернуть логическое значение в NSNumber и затем выполнить @synchronize, если захотите. В качестве альтернативы, после того, как я написал этот небольшой фрагмент, я понял, что было бы лучше сделать проверку текущего NSTime вместо sleepForTimeInterval: но вы поймете, в чем суть. :)

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