Что эквивалентно Java Thread.sleep () в Objective-C / Cocoa?

112

В Java вы можете приостановить выполнение текущего потока на некоторое время, используя Thread.sleep(). Есть ли что-то подобное в Objective-C?

Levi
источник

Ответы:

160

Да, есть + [NSThread sleepForTimeInterval:]

(Чтобы вы знали, на вопросы в будущем, Objective-C - это сам язык; библиотека объектов (по крайней мере, один из них) - это Cocoa.)

Сморгонь
источник
6
Thnx! <br> на будущее, определение на самом деле + [NSThread sleepForTimeInterval:] (поэтому используется как [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
Это потрясающе. Спасибо! Я только что закончил свои анимационные блоки, и это сработало как шарм.
RileyE
как насчет сна на главной тераде?
jerinho.com
1
Это то же самое; основной поток - это просто поток. Однако спать в основном потоке - это обычно плохая идея, так как это делает вашу программу невосприимчивой.
smorgan
4
для тех, кому интересно, [NSThread sleepForTimeInteval:] то же самое, что [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Сон в течение одной секунды на Java:

Thread.sleep(1000);

Сон в течение одной секунды в цели C:

[NSThread sleepForTimeInterval:1.0f];
Рок Стрниша
источник
40

Почему ты спишь? Когда вы спите, вы блокируете пользовательский интерфейс, а также любую фоновую загрузку URL-адресов не в других потоках (асинхронные методы NSURL по-прежнему работают в текущем потоке).

Скорее всего, вы действительно хотите выполнитьSelector: withObject: AfterDelay. Это метод в NSObject, который вы можете использовать для вызова метода через некоторый заранее заданный интервал позже - он планирует вызов, который будет выполнен позже, но все остальные вещи, которые обрабатывает поток (например, пользовательский интерфейс и загрузка данных), будут все еще продолжаем.

Кендалл Хельмштеттер Гельнер
источник
43
Сон мне пригодится в тестовых целях. Я могу смоделировать некоторые задержки в сети, чтобы убедиться, что мое приложение правильно реагирует. В настоящее время я тестирую на локальном веб-сервере, так что все происходит практически мгновенно.
brantonb
6
Сон - это неправильный способ проверки сетевых задержек. Посмотрите ответ на этот вопрос stackoverflow.com/questions/1502060/…, чтобы узнать, как тестировать переменные скорости сетей в симуляторе. Поскольку засыпание основного потока блокирует все, вы вообще не моделируете сетевую задержку, а скорее приостанавливаете работу приложения.
Кендалл Хельмштеттер Гельнер,
Спящий режим полезен для имитации того, что делается при операции соединения в потоке JAVA. Вы спите 10 миллисекунд, проверяете, мертв ли ​​поток, затем можете его освободить.
Mike S
1
Если вы спите какое-то время, ваш поток будет точно в том же состоянии, что и до того, как вы заснули. Это плохой тест, потому что в реальном мире ваше приложение будет обрабатывать, а не спать. Вот почему так важно понять, как проводить тесты, не полагаясь на сон.
Кендалл Хельмштеттер Гельнер,
+1 Спасибо, что указали на альтернативное решение! Как раз то, что я искал :)
jpswain 05
7

Конечно, вы также можете использовать стандартные вызовы Unix sleep () и usleep (). (Однако при написании Cocoa я бы остановился на [NSThread sleepForTimeInterval:].)

Билл Хейман
источник
5

Если вы используете NSThread sleepForTimeInterval (код с комментариями) для сна, выборка данных будет заблокирована, но + [NSThread sleepForTimeInterval:] (метод checkLoad) не будет блокировать выборку данных.

Мой пример кода, как показано ниже:

- (void)viewDidAppear:(BOOL)animated
{
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
//    while (_loans == nil || _loans.count == 0)
//    {
//        [NSThread sleepForTimeInterval:1.0f];
//        [self reloadLoansFormApi];
//        NSLog(@"sleep ");
//    }
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
}

-(void) checkLoad
{
    [self reloadLoansFormApi];
    if (_loans == nil || _loans.count == 0)
    {
        [self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
    } else
    {
        NSLog(@"size %d", _loans.count);
        [self.tableView reloadData];
        //hide the loader view
        [HUD hideUIBlockingIndicator];
    }
}
у лян
источник
0

usleep () также можно использовать, поскольку ive временами приостанавливал текущий поток

j2emanue
источник