Как я могу заставить основной поток ждать несколько секунд и затем вызывать метод? - PullRequest
1 голос
/ 27 июня 2011

Я очень новичок в программировании на Objective C и начал программировать простое упражнение.Я хочу, чтобы мой main() вызывал метод из класса и из этого метода использовал executeSelector: (SEL) withObject: afterDelay.Проблема в том, что он не вызывает метод и тоже не задерживает.// main

int main (int argc, const char * argv[])
{
...
    State * state = [[State alloc] init];
    [state startTimer];
   ...
}

// State.m

-(void)complete{
    NSLog(@"The door is Open (OPENING ==> OPEN)");
    [door setState:[door openState]];
}

-(void)startTimer{
    NSLog(@"The timer has started on Opening state");
//    timer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(complete) userInfo:nil repeats:NO];
//    [timer retain];
//    [timer fire];
//    [timer release];
    [self performSelector: @selector(complete) withObject:nil afterDelay:30];
}

Я немного изменил код, но это то же самое.Это не проблема в остальной части кода, но в методе startTimer(), потому что он не вызывает метод complete().Если я использую NSThread (который закомментирован), он будет вызывать его, но все равно без задержки.Я просмотрел все места и увидел, что для моих целей это лучшее решение, но оно не работает для меня.Чтобы получить представление о том, что должна делать программа, состояние должно оставаться в течение 30 секунд при «ОТКРЫТИИ», а затем complete и переводить его в состояние ОТКРЫТО.

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

executeSelector: (SEL) withObject: afterDelay требует, чтобы вы использовали цикл выполнения .В обычном приложении цикл запуска устанавливается и запускается автоматически.В программе командной строки (такой как ваша) вам нужно будет настроить и запустить цикл выполнения самостоятельно.Пример кода здесь .

Однако, если вы просто хотите немного отложить вашу программу и больше ничего не делать, проще использовать функцию sleep () .

1 голос
/ 27 июня 2011

executeSelector будет вызываться в текущем контексте цикла выполнения (контекст цикла выполнения вставки вызова).Если контекст цикла выполнения больше не активен, когда вызов должен произойти, все не будет работать.

Убедитесь, что ваш цикл выполнения вызова вызывающего потока активен.---- может быть, я могу лучше понять, если вы покажете больше кода из своей основной функции.

Почему потоковое решение сработало с вашей стороны - когда вы создаете поток, его исполняет процесс --- такнезависимо от вызывающего цикла выполнения вторичный поток будет вызываться в области процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...