NSRunloops和强制事件处理

时间:2009-04-06 23:14:52

标签: iphone cocoa-touch

我的iPhone应用程序中有几个标签需要几秒钟才能加载(从本地sqlite数据库中提取大量数据)。当用户触摸选项卡时,看起来好像应用程序什么也没做。我试图把一个窗口显示一个旋转器,但由于处理紧随其后,它从未显示过。

我知道我有几个不同的选项可以异步加载数据,但我想轮询社区,看看是否有任何潜在的问题,只需强制NSRunloop的另一个循环来显示窗口。

这是我的代码看起来像......

[[ActivityIndicator sharedActivityIndicator] show];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

在1到10的等级上,你对这个黑客的评价有多糟糕?

2 个答案:

答案 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,请为各种崩溃做好准备。 我发现其他人也有问题:

  1. http://lists.apple.com/archives/xcode-users/2009/Apr/msg00313.html
  2. http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/16246-trying-make-modal-dialog-using-nested-nsrunloop.html