我的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
上,然后照常推送。
所有这些都发生在模拟器中(我目前无法在物理设备上进行测试)。
•我使用SDSegmentedControl
,UISegmentedControl
的子类,但我尝试使用后者,同样的问题也会发生。
•我删除了UINavigationController
并用模态segue替换了推送。它似乎运行得更快,但UI完全搞砸了:在segue期间没有动画(即使我将其设置为“是”),标签栏不会显示段上的文字或图标,直到你点击它们,我的分段控制不会出现。
我似乎无法理解发生了什么。有什么帮助吗?
答案 0 :(得分:1)
听起来您可能正在后台线程中执行操作,这很容易发生,具体取决于您的通知来源。 UIKit调用(如-performSegueWithIdentifier:sender:
)不是线程安全的,并且在主线程以外的线程上调用时具有不可预测的结果。
尝试使用以下内容更新-loadingDidComplete
方法的开头:
-(void)loadingDidComplete {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(loadingDidComplete)
withObject:nil
waitUntilDone:NO];
return;
}
// ... rest of the method
}