Ответ 1
Вы можете использовать
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
или если вы хотите периодически отображать его, проверьте класс NSTimer
.
Я хочу изменить текст UILabel
через 2 секунды.
Я попытался настроить текст UILabel
на "Текст" и использовать sleep(2)
и, наконец, изменить текст на "Другой текст" .
Но sleep(2)
только замораживает приложение, а "Другой текст" устанавливается без отображения "Текст" в течение 2 секунд.
Как я могу отобразить "Текст" в течение 2 секунд, а затем показать "Другой текст" ?
Вы можете использовать
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
или если вы хотите периодически отображать его, проверьте класс NSTimer
.
Я знаю, что опоздал на эту вечеринку. Но я обнаружил, что люди не упоминают нить сна. Если вы используете GCD для вызова этой функции. Ты можешь использовать:
[NSThread sleepForTimeInterval:2.0f];
задержать нить на 2 секунды.
[self changeText: @"A text"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Here your non-main thread.
[NSThread sleepForTimeInterval:2.0f];
dispatch_async(dispatch_get_main_queue(), ^{
//Here you returns to main thread.
[self changeText: @"Another text"];
});
});
Я думаю, что NSTimer - отличное решение. Мое решение просто дает еще один вариант для достижения цели NSTimer.
Пожалуйста, прочитайте: Как я могу использовать NSTimer?
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(doSomethingWhenTimeIsUp:)
userInfo:nil
repeats:NO];
В классе вам нужен этот метод:
- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
// YES! Do something here!!
}
В Swift 2.0 вы можете использовать этот способ:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: "doSomethingWhenTimeIsUp:",
userInfo: nil,
repeats: false)
Он создает сущность NSTimer и автоматически добавляет таймер в NSRunLoop, связанный с NSThread, в котором создается таймер.
В Swift 2.2 способ вызвать select:
#selector(doSomethingWhenTimeIsUp(_:))
Итак, это что-то вроде:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp()),
userInfo: nil,
repeats: false)
В Swift 3 способ вызова select:
#selector(doSomethingWhenTimeIsUp)
Итак, это что-то вроде:
Timer.scheduledTimer(timeInterval: 2.0,
target: self,
selector:#selector(doSomethingWhenTimeIsUp),
userInfo: nil,
repeats: false)
Тогда функция должна выглядеть так:
@objc private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
В Swift 4 мы можем сделать, как показано ниже.
let delaySeconds = 2.0
DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
doSomethingWhenTimeIsUp()
}
Тогда функция должна выглядеть так:
private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
Grand Central Dispatch имеет вспомогательную функцию dispatch_after()
для выполнения операций после задержки, которая может быть весьма полезной. Вы можете указать время ожидания перед исполнением и экземпляр dispatch_queue_t
для запуска. Вы можете использовать dispatch_get_main_queue()
для выполнения в основном потоке (UI).
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// do something
});
В Swift 3 приведенный выше пример можно записать в виде:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// do something
}
Вы можете использовать NSTimer
, например:
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(updateLabel:)
userInfo:nil
repeats:YES];
Определите другой метод updateLabel
и выполните обновление там. Определите свое времяInterval, чтобы удовлетворить ваши потребности...
Также установка repeats
в YES
гарантирует, что этот селектор будет выполняться каждые 0,5 секунды (в приведенном выше случае).
Вы можете выполнить это с помощью таймера, например
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:4.0 target:self selector:@selector(eventToFire:) userInfo:nil repeats:YES]; // Fire every 4 seconds.
...
- (void)eventToFire:(NSTimer*)timer {
// Do Something
}
Это связано с тем, что представление не обновляется до конца runloop. Вместо использования сна попробуйте использовать NSTimer для установки определенного времени для обновления представления.
Вам нужно использовать таймер. Использование сна остановит всю вашу программу. Проверьте NSTimer
Следующий метод хорош.
Вы можете заменить свой
сон (1);
с
dispatch_semaphore_t semaphore = dispatch_semaphore_create (0); dispatch_semaphore_wait (семафор, dispatch_time (DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));