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

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

Ответ 1

Да, там + [NSThread sleepForTimeInterval:]

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

Ответ 2

Спящий режим для одной секунды в Java:

Thread.sleep(1000);

Сон для секунды в Objective C:

[NSThread sleepForTimeInterval:1.0f];

Ответ 3

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

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

Ответ 4

Конечно, вы также можете использовать стандартные вызовы 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];
    }
}

Ответ 6

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