performSelector:withObject:viewDidAppear中的afterDelay在应用程序启动时不起作用

时间:2011-09-14 21:41:51

标签: xcode viewdidappear

我必须将一些代码从viewDidAppear移动到新的选择器,以便在0.1f秒后触发。 所以我做了类似的事情:

-(void) viewDidAppear:(BOOL)animated{
    [self performSelector:@selector(startShowing) withObject:nil afterDelay:0.1f];      
}

-(void) startShowing{
    NSLog(@"start Showing");
    ............
}

当我启动应用程序时,没有任何反应,“开始显示”没有出现。 如果我改变视图然后回到第一个视图,它就可以了。

有人知道为什么吗?

1 个答案:

答案 0 :(得分:2)

问题是延迟依赖于NSTimer的底层实现,它依赖于NSRunLoop,它在应用程序完成启动时实例化。

来自Threading Programming Guide

“在[a]线程上执行选择器时,目标线程必须有一个活动的运行循环。对于你创建的线程,这意味着要等到代码显式启动运行循环。因为主线程启动自己的运行循环但是,一旦应用程序调用应用程序委托的applicationDidFinishLaunching:方法,就可以开始在该线程上发出调用。运行循环每次通过循环处理所有排队的执行选择器调用,而不是在每次循环迭代期间处理一个。“

所以检查一下applicationDidFinishLaunching:是否已经解雇了。你说你刚刚启动了应用程序。我打赌它还没有完成启动。

如果这是问题,你可以通过几种方式解决它。对我来说最简单的是调用performSelector:withObject:afterDelay:from applicationDidFinishLaunching。