Что эквивалентно Java Thread.sleep () в Objective-C / Какао? - PullRequest
108 голосов
/ 06 мая 2009

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

Ответы [ 6 ]

156 голосов
/ 06 мая 2009

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

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

85 голосов
/ 30 мая 2013

Спит одна секунда в Java:

Thread.sleep(1000);

Сон на одну секунду в Цели C:

[NSThread sleepForTimeInterval:1.0f];
41 голосов
/ 06 мая 2009

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

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

7 голосов
/ 06 мая 2009

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

5 голосов
/ 25 марта 2013

Если вы используете 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 голосов
/ 24 января 2013

usleep () также можно использовать, так как я использовал это для приостановки текущего потока время от времени

...