1

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

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

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

当我启动应用程序时,什么也没有发生,“开始显示”没有出现。如果我改变视图然后回到第一个视图,它就可以工作。

有人知道为什么吗?

4

1 回答 1

2

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

线程编程指南

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

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

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

于 2011-10-18T02:33:14.710 回答