如何让主线程等待几秒钟然后调用方法?

时间:2011-06-27 10:38:15

标签: objective-c c

我是Objective C编程的新手,我开始编写一个简单的练习。 我希望我的main()从类中调用方法,并从该方法调用executeSelector:(SEL)withObject:afterDelay。 问题是它不会调用该方法,也不会延迟。 //主

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 个答案:

答案 0 :(得分:2)

performSelector:(SEL) withObject:afterDelay要求您使用run loop。在正常的应用程序中,运行循环已设置并自动运行。在命令行程序(例如你的程序)中,您需要自己设置并运行运行循环。示例代码here

但是,如果你只想延迟你的程序而不需要做任何其他事情,那么使用sleep()函数会更简单。

答案 1 :(得分:1)

将在当前的运行循环上下文(调用插入运行循环上下文)上调用performSelector。如果运行循环上下文在调用必须发生时不再有效,则事情将无法工作。

确保调用线程的调用运行循环处于活动状态。 ----如果你从主函数中显示更多代码,我可能会更好理解。

为什么线程解决方案适用于您 - 当您创建线程时,它将由进程执行---因此无论调用运行循环辅助线程是否将在进程范围内调用。