Подтвердить что ты не робот

Как ждать в Objective-C и Swift

Я хочу изменить текст UILabel через 2 секунды.

Я попытался настроить текст UILabel на "Текст" и использовать sleep(2) и, наконец, изменить текст на "Другой текст" .

Но sleep(2) только замораживает приложение, а "Другой текст" устанавливается без отображения "Текст" в течение 2 секунд.

Как я могу отобразить "Текст" в течение 2 секунд, а затем показать "Другой текст" ?

4b9b3361

Ответ 1

Вы можете использовать

[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];

или если вы хотите периодически отображать его, проверьте класс NSTimer.

Ответ 2

Я знаю, что опоздал на эту вечеринку. Но я обнаружил, что люди не упоминают нить сна. Если вы используете 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"];
        });
    });

Изменить 2 (февраль 2015 г.):

Я думаю, что NSTimer - отличное решение. Мое решение просто дает еще один вариант для достижения цели NSTimer.

Пожалуйста, прочитайте: Как я могу использовать NSTimer?

[NSTimer scheduledTimerWithTimeInterval:2.0
                                 target:self
                               selector:@selector(doSomethingWhenTimeIsUp:)
                               userInfo:nil
                                repeats:NO];

В классе вам нужен этот метод:

- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {

        // YES! Do something here!!

}

Изменить 3 (май 2016 г.):

В Swift 2.0 вы можете использовать этот способ:

 NSTimer.scheduledTimerWithTimeInterval(2.0, 
                                         target: self, 
                                       selector: "doSomethingWhenTimeIsUp:", 
                                       userInfo: nil, 
                                        repeats: false)

Он создает сущность NSTimer и автоматически добавляет таймер в NSRunLoop, связанный с NSThread, в котором создается таймер.

Изменить 4 (июнь 2016 г.):

В Swift 2.2 способ вызвать select:

#selector(doSomethingWhenTimeIsUp(_:))

Итак, это что-то вроде:

  NSTimer.scheduledTimerWithTimeInterval(2.0,
                                      target: self,
                                      selector: #selector(doSomethingWhenTimeIsUp()),
                                      userInfo: nil,
                                      repeats: false)

Изменить 5 (октябрь 2016 г.):

В 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
        }

Изменить 6 (май 2018 года):

В Swift 4 мы можем сделать, как показано ниже.

    let delaySeconds = 2.0
    DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
        doSomethingWhenTimeIsUp()
    }  

Тогда функция должна выглядеть так:

    private func doSomethingWhenTimeIsUp(){
        // Do something when time is up
        }

Ответ 3

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
}

Ответ 4

Вы можете использовать NSTimer, например:

[NSTimer scheduledTimerWithTimeInterval:0.5 
                                 target:self 
                               selector:@selector(updateLabel:) 
                               userInfo:nil 
                                repeats:YES];

Определите другой метод updateLabel и выполните обновление там. Определите свое времяInterval, чтобы удовлетворить ваши потребности...

Также установка repeats в YES гарантирует, что этот селектор будет выполняться каждые 0,5 секунды (в приведенном выше случае).

Ответ 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
   }

Ответ 6

Это связано с тем, что представление не обновляется до конца runloop. Вместо использования сна попробуйте использовать NSTimer для установки определенного времени для обновления представления.

Ответ 7

Вам нужно использовать таймер. Использование сна остановит всю вашу программу. Проверьте NSTimer

Ответ 8

Следующий метод хорош.

Вы можете заменить свой

сон (1);

с

dispatch_semaphore_t semaphore = dispatch_semaphore_create (0); dispatch_semaphore_wait (семафор, dispatch_time (DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));