Xcode Objective-C |iOS: функция задержки / помощь NSTimer? - PullRequest
33 голосов
/ 14 мая 2011

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

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

Например:

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

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

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

Спасибо.

-Paul

Ответы [ 7 ]

51 голосов
/ 14 мая 2011

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];
}
...
47 голосов
/ 19 ноября 2012
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)
});
29 голосов
/ 01 сентября 2013

Чем меньше код, тем лучше код.

[NSThread sleepForTimeInterval:0.06];

Swift:

Thread.sleep(forTimeInterval: 0.06)
25 голосов
/ 14 июля 2011

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

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

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

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

16 голосов
/ 25 мая 2011

Попробуйте

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
3 голосов
/ 17 ноября 2013

Я бы хотел добавить немного ответа Авнера Барра.При использовании 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

});
0 голосов
/ 14 августа 2012
[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];

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

...