我必须将一些代码从viewDidAppear移动到新的选择器,以便在0.1f秒后触发。 所以我做了类似的事情:
-(void) viewDidAppear:(BOOL)animated{
[self performSelector:@selector(startShowing) withObject:nil afterDelay:0.1f];
}
-(void) startShowing{
NSLog(@"start Showing");
............
}
当我启动应用程序时,没有任何反应,“开始显示”没有出现。 如果我改变视图然后回到第一个视图,它就可以了。
有人知道为什么吗?
答案 0 :(得分:2)
问题是延迟依赖于NSTimer的底层实现,它依赖于NSRunLoop,它在应用程序完成启动时实例化。
来自Threading Programming Guide:
“在[a]线程上执行选择器时,目标线程必须有一个活动的运行循环。对于你创建的线程,这意味着要等到代码显式启动运行循环。因为主线程启动自己的运行循环但是,一旦应用程序调用应用程序委托的applicationDidFinishLaunching:方法,就可以开始在该线程上发出调用。运行循环每次通过循环处理所有排队的执行选择器调用,而不是在每次循环迭代期间处理一个。“
所以检查一下applicationDidFinishLaunching:是否已经解雇了。你说你刚刚启动了应用程序。我打赌它还没有完成启动。
如果这是问题,你可以通过几种方式解决它。对我来说最简单的是调用performSelector:withObject:afterDelay:from applicationDidFinishLaunching。