推送视图控制器后出现意外延迟
Posted
技术标签:
【中文标题】推送视图控制器后出现意外延迟【英文标题】:Unexpected delay after pushing view controller 【发布时间】:2016-03-31 10:10:41 【问题描述】:我有标签栏控制器,在其中一个标签中我有 3 个容器视图控制器。只能呈现一个,其他的暂时被删除。这些控制器的视图在 xib 中定义。
在其中一个容器中,我有表格视图。
当我点击单元格时,我必须推动视图控制器。
第一次启动应用程序时,我在推送视图控制器时出现延迟。在我回到表格视图并再次推送后,没有延迟。
我在新控制器的didSelectRowAtIndexPath
和viewDidLoad
打印时间,延迟在2到4秒之间。
这是我用于推送视图控制器的代码:
EventDetailsViewController *eventDetailsVc = [[EventDetailsViewController alloc]init];
Events *event = [self.events objectAtIndex:indexPath.row];
eventDetailsVc.curentEvent = event;
NSDateFormatter *f2 = [[NSDateFormatter alloc] init];
[f2 setDateFormat:@"dd MMMM, hh:mm:ss.SSS a"];
NSLog([f2 stringFromDate:[NSDate date]]);
dispatch_async(dispatch_get_main_queue(), ^
[self.navigationController pushViewController:eventDetailsVc animated:YES];
);
通常我在推送视图控制器时不使用dispatch_async
,但这是我找到的建议解决方案之一。我也试过self.parentViewController.navigationController
,结果一样。
我不知道如何处理这个延迟,有人可以帮助我。
谢谢。
【问题讨论】:
也许你的主线程被阻塞了,不是吗? 您在 init() 或 viewdidload() 方法中执行的任何任务会阻塞您的主界面? 感谢您的建议。我在 viewDidAppear 中下载数据。您可以在第一个答案评论中看到示例。 【参考方案1】:这里的问题很可能是子视图控制器。确保 viewDidLoad / loadView 不会启动任何昂贵的操作(例如从 Internet 下载数据)。
viewDidLoad 和 loadView 仅在第一次显示视图控制器时触发一次。一旦设置了视图属性,这些方法将不再触发。
任何内容的加载都应该在后台线程上完成(可能使用像 AFNetworking 这样的库)并且应该(通常)从 viewWillAppear 或 viewDidAppear 开始。
【讨论】:
沃尔夫冈,谢谢你的回答。在视图中没有加载我只将tableView的委托和数据源分配给self。在 viewDidAppear 我从网上下载数据。我不使用 AFNetworking,我不能在这个项目上这样做。这就是我调用网络服务的方式 [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 禁用网络代码,看看应用程序是否仍然如此缓慢。如果这是真的,那么加载 xib 可能会出现一些问题。否则问题出在网络或解析代码中。以上是关于推送视图控制器后出现意外延迟的主要内容,如果未能解决你的问题,请参考以下文章