Xcode performSelector:withObject:afterDelay在ViewDidDisplay中的显示在应用程序启动时不起作用

Xcode performSelector:withObject:afterDelay在ViewDidDisplay中的显示在应用程序启动时不起作用,xcode,viewdidappear,Xcode,Viewdidappear,我必须将一些代码从ViewDidDisplay移动到新的选择器,以便在0.1f秒后触发。 所以我做了一些类似的事情: -(void) viewDidAppear:(BOOL)animated{ [self performSelector:@selector(startShowing) withObject:nil afterDelay:0.1f]; } -(void) startShowing{ NSLog(@"start Showing"); ......

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

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

-(void) startShowing{
    NSLog(@"start Showing");
    ............
}
当我启动应用程序时,不会发生任何事情,“开始显示”不会出现。 如果我更改视图,然后返回到第一个视图,则它正在工作


有人知道原因吗?

问题在于延迟依赖于NSTimer的底层实现,后者依赖于nsrunlop,在应用程序完成启动时实例化

从:

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

因此,请检查ApplicationIDFinishLaunching:是否已启动。你说你刚刚启动了应用程序。我打赌还没有完成


如果这是个问题,你可以用几种方法来解决。对我来说,最简单的方法是调用performSelector:withObject:afterDelay:from ApplicationIDFinishLaunching。

能否放置NSLog(@“视图确实出现”);在您的ViewDidDisplay方法中。另外[超级视图显示:是];在您的[self-performSelector…Method]之前,显示来自NSLog(@“视图确实出现”)的消息。[超级视图确实出现:是];已经存在。当我运行此代码时,它工作正常。您使用的是什么设备/平台?在iPhone 4.2和Xcode 4.0.2上试用过。似乎很公平。今晚将试用。如果是这样,我可以用其他方法修复它吗?其他方法?嗯……苹果已经半弃用了应用程序IDfinishLaunching:支持应用程序:didFinishLaunchingWithOptions:方法也由UIApplicationLegate类使用。您可能应该使用application:didFinishLaunchingWithOptions:。您的解决方案实际上取决于您以这种方式调用startShowing的原因。您是否正在尝试解决另一个计时问题?如果希望在应用程序委托知道时收到通知,则键值观察将非常有用它已经启动了。