我正在更新一个相当简单的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
答案 0 :(得分:1)
使用解决方案更新此线程的快速说明。
performSelectorOnMainThread方法证明是正确的。调用选择器时navController对象为nil的原因是由于我创建了app delegate的新实例:
AppDelegate *appDelegate = [AppDelegate alloc] init];
而不是引用现有对象:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
像魅力一样工作。