我的iOS 6应用程序有一个简单的工作流程:

UINavigationController -> loadingVC -(push)-> UITabBarController -> UIViewController(s)

我通过performSegueWithIdentifier:调用了推送,使用NSNotificationCenter上的观察者对其进行了调用,但是加载UITabBarController的根VC花费了太多时间(〜35秒)。

这是我如何在loadingVC中注册观察者的方法:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadingDidComplete) name:@"dataDoneLoading" object:nil];

然后,我的loadingVC从我的AppDelegate调用一些方法,该方法将继续进行一些网络工作(获取和解析XML文件),并等待将触发的通知:
[self performSegueWithIdentifier:@"finishedLoading" sender:self];

这是控制台日志,我开始加载UITabBarController的根VC:
2013-05-06 16:28:19.720 *** [2289:19303] Notif sent
2013-05-06 16:28:19.720 *** [2289:19303] Notif received
2013-05-06 16:28:19.727 *** [2289:19303] viewDidLoad in         (some basic stuff)
2013-05-06 16:28:19.728 *** [2289:19303] viewDidLoad out
2013-05-06 16:28:19.729 *** [2289:19303] viewWillAppear         (NSLog only)
2013-05-06 16:28:54.475 *** [2289:19303] In numberOfSections    (datasource method of a UITableview, returns 0)
2013-05-06 16:28:54.832 *** [2289:12b03] viewDidAppear          (NSLog only)

如您所见,在viewWillAppear之后,我有35秒钟才真正开始推送。该应用程序挂在loadingVC上,然后像往常一样推送。

所有这些都在模拟器中发生(我暂时无法在物理设备上进行测试)。

我试过了

•我使用SDSegmentedControl的子类UISegmentedControl,但是我尝试使用后者,但同样的问题也会发生。

•我删除了UINavigationController,并用模式搜索替换了推送。它的运行速度似乎更快,但是UI却完全混乱了:在搜索过程中没有动画(即使我将其设置为“是”),标签栏也不会在分段上显示文本或图标,直到您点击它们为止,分段控件不会出现。

我似乎无法理解发生了什么。有什么帮助吗?

最佳答案

听起来您可能正在后台线程中执行操作,这很容易发生,具体取决于通知的来源。 UIKit调用(如-performSegueWithIdentifier:sender:)不是线程安全的,并且在除主线程之外的其他线程上调用时,其结果均不可预测。

尝试使用以下命令更新-loadingDidComplete方法的开头:

-(void)loadingDidComplete {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(loadingDidComplete)
                               withObject:nil
                            waitUntilDone:NO];
        return;
    }

    // ... rest of the method
}

关于ios - UIViewController在viewWillAppear之后挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16401243/

10-11 07:00