Для этого вам не нужен NSTimer, вы можете просто использовать executeSelector: withObject: afterDelay: последовательность от одного метода к другому, пока вы не начнете снова. Запустите процесс, когда кнопка удерживается, и вызовите cancelPreviousPerformRequestsWithTarget: selector: object: когда кнопка будет отпущена. Что-то вроде:
- (void) step1
{
// turn blue
[self performSelector:@selector(step2) withObject:nil afterDelay:1.0];
}
- (void) step2
{
// change image
[self performSelector:@selector(step3) withObject:nil afterDelay:2.0];
}
- (void) step3
{
// turn red
[self performSelector:@selector(step1) withObject:nil afterDelay:3.0];
}
- (void) stopSteps
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step1) object:nil];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step2) object:nil];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step3) object:nil];
}
Вы можете вспомнить выполняемый в данный момент селектор executeSelector и отменить только его, но вряд ли стоит его помнить.
В качестве альтернативы, вы могли бы использовать NSTimer и конечный автомат, но для того, что вы описываете, вышеупомянутое, вероятно, проще - это зависит от того, насколько последовательна ваша последовательность и легче ли определить вашу последовательность как набор шагов, таких как выше, или набор данных (в этом случае используйте какой-либо конечный автомат, либо с NSTimer, либо executeSelector: withObject: afterDelay:)