Чувак, надеюсь, это вам поможет, не знаю, почему я потратил столько времени на это ...:)
Если вы используете NSTimer:timerWithTimeInterval:...
, вам нужно добавить таймер в цикл выполненияиспользуя NSRunLoop:addTimer:forMode
.Вот почему ваш таймер не срабатывает.Если вы используете NSTimer:scheduledTimerWithTimeInerval:...
, он будет добавлен к текущему циклу выполнения.
Несколько соображений по поводу вашей реализации.
У вас много косвенных указаний.Вы можете установить его непосредственно в doStuff
и избавиться от метода setTimer
.
Нет причин устанавливать таймер в главном потоке, вы можете установить его в любом потоке.
Вам вообще не нужен таймер, я предложу альтернативную реализацию ниже.
АЛЬТЕРНАТИВНАЯ РЕАЛИЗАЦИЯ:
Добавить свойство BOOL, например @property (nonatomic) BOOL isFinished;
Когда пользователь нажимает кнопку, установите isFinished = NO;
и начните свою первую операцию.
Когда операция завершится, если isFinished == NO
, начните другую операцию.Вы можете добавить задержку, используя performSelector:afterDelay:
или dispatch_after()
Когда пользователь перестает нажимать кнопку, установите isFinished = YES
Эта альтернативная реализация предполагает, что вы хотите начать следующую операцию после завершения первой.Если вы хотите, чтобы операция выполнялась после фиксированного интервала, независимо от того, обрабатывается ли уже какая-либо операция, измените свой таймер на повторение и, когда таймер сработает, проверьте isFinished == YES
, чтобы сделать таймер недействительным.