在iPhone应用程序中使用睡眠(特别是使用UINavigationController)

在iPhone应用程序中使用睡眠(特别是使用UINavigationController),iphone,uinavigationcontroller,sleep,Iphone,Uinavigationcontroller,Sleep,我对iPhone开发相当陌生,但我即将发布我的第一个应用程序(与我运行的一个网站相关)。该应用程序需要一个非常大的数据库,因此我决定只在本地存储最常用的数据,通过JSON web服务调用从我的网站运行的数据库检索其他数据 在使用模拟器(点击实时数据库)执行OK时,依靠web服务调用进行搜索的时间比我在手机上运行时希望的要长。与即时的本机搜索相比,这些调用看起来更糟糕。为了减少相对差异,我想为本机搜索(web服务搜索已经使用了一个)添加一个假间隙(带有活动指示器的页面),但在与睡眠(n)结合使用时

我对iPhone开发相当陌生,但我即将发布我的第一个应用程序(与我运行的一个网站相关)。该应用程序需要一个非常大的数据库,因此我决定只在本地存储最常用的数据,通过JSON web服务调用从我的网站运行的数据库检索其他数据

在使用模拟器(点击实时数据库)执行OK时,依靠web服务调用进行搜索的时间比我在手机上运行时希望的要长。与即时的本机搜索相比,这些调用看起来更糟糕。为了减少相对差异,我想为本机搜索(web服务搜索已经使用了一个)添加一个假间隙(带有活动指示器的页面),但在与睡眠(n)结合使用时,导航控制器推送的时间一直存在问题

无论如何,我的应用程序的搜索部分是一个导航控制器,它位于tabController选项卡中。当尝试使用这样的代码时:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES]; sleep(2); [[tabBarController.viewControllers对象索引:0]pushViewController:(UIViewController*)waitingController动画:是]; 睡眠(2); 我发现推送总是在执行之前等待睡眠完成,而我想要的效果是推送viewcontroller,然后应用程序等待两秒钟,然后继续模拟搜索过程

我在navController推送中还遇到了一些其他奇怪的结果,有几次我经历了两个独立的ViewController的混搭,当我推送的一个作为中间层的ViewController保留在位置上时,只保留了我要推送的那个ViewController的标题

我确信这是我根本不理解的原因,所以我希望在这里得到一些指导

干杯

Alan。

睡眠(浮动)阻塞主线程,导致UI冻结。相反,您应该计划稍后使用

例如:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];

我会考虑改变你的架构,而不是睡在主线程上——这不是一个很好的用户体验

研究使用NSOperation来控制您与web服务的交互——这将允许您对操作进行排队,并让它们以特定的顺序或并行方式运行

NSOperation是提供健壮线程操作的一种非常简单的方法,您可以选择使用任何您想要执行的更新回调主线程

我认为这种架构将帮助您更好地使用用户界面,但一旦您重新配置了使用操作的想法,您将发现许多其他好处


注意:我花了几次时间才真正掌握NSOperation和NSOperationQueue,但我投入的时间绝对值得。

谢谢!这很有效。在从本机搜索返回数据后,我按下waitController(Interstitual),然后在加载结果的appDelegate中调用方法时使用PerformSelect,并有延迟。谢谢。我会调查这次行动的。虽然在这个例子中,我对web服务调用的处理不是问题所在。我试图复制web服务调用在执行本机搜索时产生的中间页面的效果。干杯。我仍然认为你不应该在主线程上睡觉,这可能是你的问题的原因-可能使用NSOperation来管理用户界面更改的时间-即使你的操作在发送回消息到你的UI做下一件事之前只睡了2秒钟-我认为这会比睡在主线程上。当然同意,尽管我正在使用上面建议的performSelector,我假设它只是延迟了一个操作,而不是睡在线程上。(是的,我很害怕;)干杯。