Ожидание указанной продолжительности в Какао

Существует ли более простой способ ожидать определенного количества времени в Какао, чем, что я придумал ниже?

- (void) buttonPressed {
    [self makeSomeChanges];

    // give the user some visual feedback and wait a bit so he can see it
    [self displayThoseChangesToTheUser];
    [self performSelector:@selector(buttonPressedPart2:) withObject:nil afterDelay:0.35];
}

- (void) buttonPressedPart2: (id)unused {
    [self automaticallyReturnToPreviousView];
}

Только, чтобы быть ясной, нет никакой функциональной проблемы с этим кодом - моя единственная говядина является стилистической. В моем случае поток достаточно прост, что он работает, но попытка инкапсулировать его или добавить некоторые условные выражения и вещи могла стать ужасной. Это был вид нытья на меня, что я не мог найти способ ожидать и затем вернуться к тому же самому вопросу в коде как этот (фиктивный) пример:

- (void) buttonPressed {
    [self doStuff];
    [UIMagicUnicorn waitForDuration:0.35];
    [self doStuffAfterWaiting];
}
27
задан Purple Ninja Girl 9 February 2010 в 20:38
поделиться

6 ответов

Есть

usleep(1000000);

и

[NSThread sleepForTimeInterval:1.0f];

оба из которых будут спать в течение 1 секунды.

68
ответ дан 28 November 2019 в 04:16
поделиться

Вероятно, вы захотите использовать NSTimer , чтобы он отправлял сообщение doStuffAfterWaiting в качестве обратного вызова. Любой вид «сна» будет блокировать поток, пока он не проснется.Если это в вашем U.I. thread, это приведет к тому, что ваше приложение будет казаться "мертвым". Даже если это не так, это дурной тон. Подход обратного вызова освободит ЦП для выполнения других задач, пока не будет достигнут указанный вами интервал времени.

В этом документе есть примеры использования и обсуждаются различия в том, как и где создать таймер.

Конечно, performSelector: afterDelay: делает то же самое.

2
ответ дан 28 November 2019 в 04:16
поделиться

Тадах!

Немного более информативная ссылка указывает на NSThread sleepForTimeInterval:

Это было украдено из: Что является эквивалентом Java's Thread.sleep() в Objective-C/Cocoa?

0
ответ дан 28 November 2019 в 04:16
поделиться

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

[NSTimer scheduledTimerWithTimeInterval:0.5f 
                                 target:self
                               selector: @selector(doSomething:) 
                               userInfo:nil
                                repeats:NO];

Вы хотите избежать чего-то вроде usleep (), которое просто зависнет и заставит ваше приложение перестать отвечать на запросы.

10
ответ дан 28 November 2019 в 04:16
поделиться

Я не уверен, существует ли он (пока), но с блоками в 10.6 (или PLBlocks в 10.5 и на iPhone ) должно быть довольно легко написать небольшую оболочку вроде performBlock: afterDelay: , которая делает именно то, что вы хотите, без необходимости засыпать весь поток. Это действительно был бы полезный небольшой фрагмент кода.

Майк Эш написал о подобном подходе в своем блоге :

NSString *something = ...;
RunAfterDelay(0, ^{
    NSLog(@"%@", something);
    [self doWorkWithSomething: something];
});
3
ответ дан 28 November 2019 в 04:16
поделиться

Что плохого в простом usleep? Я имею в виду, что кроме как ради "чистоты Cocoa", это все равно намного короче, чем другие решения :)

2
ответ дан 28 November 2019 в 04:16
поделиться