我是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
并将其设置为打开状态。
答案 0 :(得分:2)
performSelector:(SEL) withObject:afterDelay要求您使用run loop。在正常的应用程序中,运行循环已设置并自动运行。在命令行程序(例如你的程序)中,您需要自己设置并运行运行循环。示例代码here。
但是,如果你只想延迟你的程序而不需要做任何其他事情,那么使用sleep()函数会更简单。
答案 1 :(得分:1)
将在当前的运行循环上下文(调用插入运行循环上下文)上调用performSelector。如果运行循环上下文在调用必须发生时不再有效,则事情将无法工作。
确保调用线程的调用运行循环处于活动状态。 ----如果你从主函数中显示更多代码,我可能会更好理解。
为什么线程解决方案适用于您 - 当您创建线程时,它将由进程执行---因此无论调用运行循环辅助线程是否将在进程范围内调用。