Как ждать в Objective-C и Swift
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
класс.
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 секунды (в вышеупомянутом случае).
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:142 плюса
Вам нужно использовать таймер. Использование сна остановит всю вашу программу. Проверьте NSTimer
Автор: Pepe Размещён: 08.08.2011 02:140 плюса
Следующий метод хорош.
Вы можете заменить свой
сон (1);
с
Автор: JateXu Размещён: 28.06.2019 03:44dispatch_semaphore_t semaphore = dispatch_semaphore_create (0); dispatch_semaphore_wait (семафор, dispatch_time (DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));
Вопросы из категории :
- ios Приложение для iPhone в ландшафтном режиме, системы 2008
- ios Как мне дать моим веб-сайтам значок для iPhone?
- ios Как программно отправить смс на айфон?
- ios Как я могу разработать для iPhone, используя машину для разработки Windows?
- objective-c Открытие нестандартного URL в приложении Какао
- objective-c Каков наилучший способ перетащить NSMutableArray?
- swift Как я могу программным образом определить, работает ли мое приложение в симуляторе iphone?
- swift iOS: Convert UTC NSDate to local Timezone
- swift Как установить цель и действие для UIBarButtonItem во время выполнения
- swift Жирный и не жирный текст в одном UILabel?
- wait Как дождаться завершения в bash нескольких подпроцессов и возврата кода завершения! = 0, когда любой подпроцесс заканчивается кодом! = 0?
- wait Sleep until a specific time/date
- wait Есть ли приличная функция ожидания в C ++?
- wait Как заставить Python ждать нажатой клавиши
- performselector Как ждать в Objective-C и Swift
- performselector iOS - Как реализовать executeSelector с несколькими аргументами и с afterDelay?
- performselector Вызов метода с несколькими параметрами с помощью executeSelector ios
- performselector executeSelector: @selector withObject: nil afterDelay: not вызывает метод (Цель C)