События таймера и анимации превосходят события TouchesEnded

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

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

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

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

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

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

[Update]

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


person philsquared    schedule 30.10.2008    source источник
comment
Спасибо за настройку тегов, Крис, это может помочь большему количеству людей увидеть вопрос.   -  person philsquared    schedule 31.10.2008


Ответы (1)


Попробуйте написать свой собственный класс типа 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: но вы поняли. :)

person Jeffrey Forbes    schedule 31.10.2008
comment
Спасибо Джеффри. Я не уверен, что это тот ответ, который я ищу, но это, безусловно, стоит попробовать, и таким образом я мог бы иметь некоторый контроль над приоритетом, хотя все еще не так для анимации. На данный момент оставляю это открытым, но спасибо за ответ (и проголосовал за вас). - person philsquared; 01.11.2008