推送视图控制器后出现意外延迟

Posted

技术标签:

【中文标题】推送视图控制器后出现意外延迟【英文标题】:Unexpected delay after pushing view controller 【发布时间】:2016-03-31 10:10:41 【问题描述】:

我有标签栏控制器,在其中一个标签中我有 3 个容器视图控制器。只能呈现一个,其他的暂时被删除。这些控制器的视图在 xib 中定义。

在其中一个容器中,我有表格视图。

当我点击单元格时,我必须推动视图控制器。

第一次启动应用程序时,我在推送视图控制器时出现延迟。在我回到表格视图并再次推送后,没有延迟。

我在新控制器的didSelectRowAtIndexPathviewDidLoad打印时间,延迟在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 可能会出现一些问题。否则问题出在网络或解析代码中。

以上是关于推送视图控制器后出现意外延迟的主要内容,如果未能解决你的问题,请参考以下文章

推送视图控制器时延迟(iOS)

RxCocoa - 当有延迟时防止多个视图控制器推送

推送视图控制器后如何保留 UITabBar

在呈现模态视图控制器后推送导航控制器

模式视图控制器关闭后iOS 8键盘关闭延迟

Swift:如何取消延迟的 pushViewController?