Как отложить, сохранив отзывчивый графический интерфейс на Cocoa Touch? - PullRequest
1 голос
/ 09 февраля 2010

По сути, у меня есть массив кнопок, которые я хочу перебирать и выделять (среди прочего) одну за другой с задержкой между ними. Кажется, это простая задача, но мне не удается заставить ее работать чисто, но при этом реагировать.

Я начал с этого:

for MyButton *button in buttons {
    [button highlight];
    [button doStuff];
    usleep(800000); // Wait 800 milliseconds.
}

Но это не отвечает, поэтому я попытался использовать цикл выполнения.

void delayWithRunLoop(NSTimeInterval interval)
{
    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:interval];
    [[NSRunLoop currentRunLoop] runUntilDate:date];
}

for MyButton *button in buttons {
    [button highlight];
    [button doStuff];
    delayWithRunLoop(0.8); // Wait 800 milliseconds.
}

Однако, это также не отвечает.

Есть ли разумный способ сделать это? Кажется громоздким использование потоков или NSTimer s.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

NSTimer идеально подойдет для этой задачи.

Действие таймера будет срабатывать каждые x секунд, где x - это то, что вы указываете.

Существенным моментом является то, что это не блокирует поток, в котором он работает. Как сказал Питер в комментариях к этому ответу, я ошибся, сказав, что таймер ждет в отдельной ветке. Подробности смотрите в комментарии в комментарии.

1 голос
/ 09 февраля 2010

Не важно, Джасариен был прав, NSTimer идеально подходит.

- (void)tapButtons:(NSArray *)buttons
{
    const NSTimeInterval waitInterval = 0.5; // Wait 500 milliseconds between each button.
    NSTimeInterval nextInterval = waitInterval;
    for (MyButton *button in buttons) {
        [NSTimer scheduledTimerWithTimeInterval:nextInterval
                                         target:self
                                       selector:@selector(tapButtonForTimer:)
                                       userInfo:button
                                        repeats:NO];
        nextInterval += waitInterval;
    }
}

- (void)tapButtonForTimer:(NSTimer *)timer
{
    MyButton *button = [timer userInfo];
    [button highlight];
    [button doStuff];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...