iPhone初始数据加载和'请等待'屏幕

时间:2011-10-20 19:07:05

标签: iphone uikit

我正在更新一个相当简单的iPhone应用程序,它需要在初始设置时将初始数据加载到SQLite数据库中。我正在使用DSActivityView类提供一个很好的“请稍候”消息。整个数据加载在WiFi上大约需要15秒,在3G上大约需要30-45秒。

这整个过程源于我的app委托的应用程序:didFinishLaunchingWithOptions方法。

通过为8个表中的每个表创建一个名为UpdateTable的NSOperation对象的实例,在单独的线程中启动数据加载过程。每个操作都放在一个NSOperationQueue中,然后释放。数据加载就像一个冠军。

什么不像冠军一样工作;然而,是用主导航控制器视图替换“请稍候..”视图。

第一种方法是实例化一个NSInvocationOperation,它在我的app委托中调用一个方法来执行以下操作:

- (void) loadNavController;
{
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
    [defaultImageView removeFromSuperview];

    [DSBezelActivityView removeViewAnimated:YES];
}

在添加最后一个UpdateTable操作后,此操作已添加到队列中。

这种方法有问题的原因是因为NSInvocationOperation与线程中的其他进程并发运行;因此,上面显示的方法在可以执行最后一个表更新之前触发。

所以我尝试了以下方法:

在我的UpdateTable.m中(所有JSON和SQLite都在进行中),我输入以下行,在最后一次表更新完成后立即执行:

[appDelegate performSelectorOnMainThread:@selector(loadNavController) withObject:nil waitUntilDone:NO];

这种方法使得时机正确,但主要的UNavigationController和UIWindow对象都是nil,并且执行了loadNavController。设置一些调试中断,我注意到我的app委托的delloc方法是在执行loadNavController方法之前触发的。两个对象都通过IBOutlets分配给MainWindow,IBOutlets在App Delegate中设置为IBOutlets(非原子,保留)。我不清楚为什么dealloc正在开火,因为这个过程总共需要不到10秒。

您可能会提供任何帮助,我们将不胜感激。提前谢谢了。

VB

1 个答案:

答案 0 :(得分:1)

使用解决方案更新此线程的快速说明。

performSelectorOnMainThread方法证明是正确的。调用选择器时navController对象为nil的原因是由于我创建了app delegate的新实例:

AppDelegate *appDelegate = [AppDelegate alloc] init];

而不是引用现有对象:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

像魅力一样工作。