Iphone nsrunlops和强制事件处理

Iphone nsrunlops和强制事件处理,iphone,cocoa-touch,Iphone,Cocoa Touch,我的iPhone应用程序中有几个选项卡,加载这些选项卡需要几秒钟(从本地sqlite数据库中提取大量数据)。当用户触摸选项卡时,应用程序似乎什么也没做。我曾尝试放置一个显示微调器的窗口,但由于随后会立即进行处理,因此从未显示该窗口 我知道我有两个不同的异步加载数据的选项,但是我想调查社区,看看强制另一个nsrunlop周期显示窗口是否有任何潜在问题 下面是我的代码的样子 [[ActivityIndicator sharedActivityIndicator] show]; [[NSRunLoop

我的iPhone应用程序中有几个选项卡,加载这些选项卡需要几秒钟(从本地sqlite数据库中提取大量数据)。当用户触摸选项卡时,应用程序似乎什么也没做。我曾尝试放置一个显示微调器的窗口,但由于随后会立即进行处理,因此从未显示该窗口

我知道我有两个不同的异步加载数据的选项,但是我想调查社区,看看强制另一个nsrunlop周期显示窗口是否有任何潜在问题

下面是我的代码的样子

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

在1到10分的范围内,你会给这个黑客打分吗?

我不知道我会给它打分,但我知道我不想那样做。干扰系统默认运行循环似乎是个坏主意

我认为有几种方法是很好的。最简单的方法是将附加处理放在单独的私有方法中,然后执行以下操作:

[[ActivityIndicator sharedActivityIndicator] show];
[self performSelector:@selector(processingMethod) withObject:nil afterDelay:0];
这将导致在指示器显示后,在运行循环结束时调用processingMethod。应该行得通

一个警告是,如果指示器已设置动画,则根据其设置方式,在processingMethod运行时可能不会设置动画。在这种情况下,您可能希望在后台线程中运行processingMethod,这可能会稍微复杂一点,或者与执行此操作一样简单:

[self performSelectorInBackground:@selector(processingMethod) withObject:nil];

潜在的复杂性是,在processingMethod结束时,当您要显示处理结果时,您可能必须将一个方法调用回主线程。

我的经验是iPhone上的事件处理代码是不可重入的。因此,如果您在默认模式下运行runloop,请为各种崩溃做好准备。 我发现其他人也有问题:


  • 你是对的,而且苹果的文档声明线程是不可重入的。您不应该访问其他线程的数据。回拨和“提供数据”是首选方法。你说的可重入是什么意思?我同意Jack的观点,我认为Lounges正在寻找他的第二个答案“performSelectorInBackground”——回拨。