我的iPhone应用程序中有几个标签需要几秒钟才能加载(从本地sqlite数据库中提取大量数据)。当用户触摸选项卡时,看起来好像应用程序什么也没做。我试图把一个窗口显示一个旋转器,但由于处理紧随其后,它从未显示过。
我知道我有几个不同的选项可以异步加载数据,但我想轮询社区,看看是否有任何潜在的问题,只需强制NSRunloop的另一个循环来显示窗口。
这是我的代码看起来像......
[[ActivityIndicator sharedActivityIndicator] show];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];
在1到10的等级上,你对这个黑客的评价有多糟糕?
答案 0 :(得分:3)
我不知道我在哪里评价它,但我知道我不想这样做。搞乱系统默认的runloop似乎是一个坏主意。
我认为有几个好方法。最简单的方法是将附加处理放在一个单独的私有方法中,然后执行以下操作:
[[ActivityIndicator sharedActivityIndicator] show];
[self performSelector:@selector(processingMethod) withObject:nil afterDelay:0];
这会导致在指示符显示后在运行循环结束时调用processingMethod。应该工作正常。
一个警告是,如果您的指标是动画的,根据它的设置方式,它可能不会在processingMethod运行时设置动画。在这种情况下,你想在后台线程中运行processingMethod,这可能会稍微复杂一些,或者可能就像这样做一样简单:
[self performSelectorInBackground:@selector(processingMethod) withObject:nil];
可能的复杂情况是,在processingMethod结束时,当你要显示处理结果时,你可能不得不将方法调回主线程。
答案 1 :(得分:1)
我的经验是iPhone上的事件处理代码不可重入。因此,如果您在默认模式下运行runloop,请为各种崩溃做好准备。 我发现其他人也有问题: