UIViewController在viewWillAppear之后挂起

时间:2013-05-06 14:45:38

标签: ios performance uinavigationcontroller uitabbarcontroller

我的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];

然后,我的loadVC从我的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上,然后照常推送。

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

我尝试了什么:

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

•我删除了UINavigationController并用模态segue替换了推送。它似乎运行得更快,但UI完全搞砸了:在segue期间没有动画(即使我将其设置为“是”),标签栏不会显示段上的文字或图标,直到你点击它们,我的分段控制不会出现。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

    // ... rest of the method
}