Xcode Objective-C | iOS: функция задержки/помощь NSTimer?

Итак, я разрабатываю свое первое приложение для iOS, и мне нужна помощь.

Простая программа на данный момент, у меня около 9 кнопок, и когда я нажимаю первую кнопку или любую кнопку, я просто хочу, чтобы первая кнопка выделялась в течение 60 миллисекунд, подсвечивание, подсветка второй кнопки, подождать 60 миллисекунд, для остальных кнопок, чтобы он выглядел как движущийся светодиод.

Я смотрел проверенный спящий/спящий режим, но как только эта продолжительность сна завершена, кажется, что он пропускает выделение /unhighlight все вместе.

Например:

- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;

и т.д. для остальных кнопок. Он задерживается, но он не задерживает "firstButton.enabled = NO;". У меня есть изображение для каждой кнопки "отключенное состояние", и я никогда не вижу его.

Любая помощь ценится! Я просмотрел NSTimer, но я не знал, как его реализовать.

Спасибо.

-Поль

Ответ 1

sleep не работает, потому что отображение может быть обновлено только после того, как ваш основной поток вернется в систему. NSTimer - это путь. Для этого вам необходимо реализовать методы, которые будут вызываться таймером для изменения кнопок. Пример:

- (void)button_circleBusy:(id)sender {
    firstButton.enabled = NO;
    // 60 milliseconds is .06 seconds
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
}
- (void)goToSecondButton:(id)sender {
    firstButton.enabled = YES;
    secondButton.enabled = NO;
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO];
}
...

Ответ 2

int64_t delayInSeconds = 0.6;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     do something to the button(s)
});

Ответ 3

Меньше кода - лучший код.

[NSThread sleepForTimeInterval:0.06];

Swift:

Thread.sleep(forTimeInterval: 0.06)

Ответ 4

Несколько менее подробный способ - использовать performSelector: withObject: afterDelay: который устанавливает для вас объект NSTimer и может быть легко отменен.

Итак, продолжая предыдущий пример, это будет

[self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];

Подробнее информация в документе

Ответ 5

Try

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];

Ответ 6

Я хотел бы добавить немного ответа Авнера Барра. При использовании int64, кажется, что, когда мы превосходим значение 1.0, функция, похоже, задерживается по-разному. Поэтому я думаю, что в этот момент мы должны использовать NSTimeInterval.

Итак, окончательный код:

NSTimeInterval delayInSeconds = 0.05;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

//do your tasks here

});

Ответ 7

[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];

Лучше всего использовать. Использование сна (15); приведет к тому, что пользователь не сможет выполнять какие-либо другие действия. С помощью следующей функции вы замените goToSecondButton соответствующим селектором или командой, которая также может быть из фреймворков.