我的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/