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

ios objective-c swift wait performselector

75522 просмотра

8 ответа

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

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

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

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

Автор: jylee Источник Размещён: 06.07.2019 12:14

Ответы (8)


40 плюса

Решение

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

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

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

Автор: Michał Zygar Размещён: 08.08.2011 02:15

79 плюса

Я знаю, что опоздал на эту вечеринку. Но я обнаружил, что люди не упоминают нить сна. Если вы используете 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
        }
Автор: Yi Jiang Размещён: 08.08.2013 02:44

28 плюса

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
}
Автор: Mick MacCallum Размещён: 08.08.2013 03:07

12 плюса

Вы можете использовать NSTimer, как так -

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

Определите другой метод updateLabelи выполните обновление там. Определите ваш timeInterval для удовлетворения ваших потребностей ...

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

Автор: Srikar Appalaraju Размещён: 08.08.2011 02:14

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
   }
Автор: George Johnston Размещён: 08.08.2011 02:14

2 плюса

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

Автор: Dave Размещён: 08.08.2011 02:14

2 плюса

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

Автор: Pepe Размещён: 08.08.2011 02:14

0 плюса

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

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

сон (1);

с

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

Автор: JateXu Размещён: 28.06.2019 03:44
Вопросы из категории :
32x32