延迟呈现模态视图控制器

我有一个标签栏的应用程序。 在所有5个选项卡中都有导航控制器,并将自定义视图控制器的实例设置为根视图控制器。 这加载得很好。 一些这些视图控制器包含表视图。 我想显示一个模式视图控制器给用户,当他们在表视图中select一行。 didSelectRowAtIndexPath委托方法的(相关部分)如下所示:

SampleSelectorViewController *sampleVC = [[SampleSelectorViewController alloc] init]; [self presentViewController:sampleVC animated:YES completion:NULL]; 

模式视图控制器出现,但它出现后非常明显的延迟。 有时甚至需要用户再次点击该行。 我已经validation了一些事情是:

  • 当用户点击该行时,表视图的didSelectRowAtIndexPath方法被调用
  • didSelectRowAtIndexPath方法不包含任何阻塞调用。 没有networking操作正在执行,模态视图控制器的设置不涉及任何处理密集型任务。 它显示的数据是静态的。
  • 如果我将新的视图控制器推到导航堆栈上(其余的完全相同),它的行为完全没有任何延迟。 只有在模态expression时才会遇到延迟。

任何想法/build议?

它似乎调用presentViewController:animated:completiontableView:didSelectRowAtIndexPath: presentViewController:animated:completion tableView:didSelectRowAtIndexPath:是有问题的。 当在乐器中使用Time Profiler时也很难find任何突出的东西。 有时我的模态观点不到一秒钟,其他时间则需要4s甚至9s。

我认为它与底层的UIPresentationController和布局有关,这是我在select连续点击和在时间分析器中看到模态表示时间区域时看到的less数几个事情之一。

存在描述此问题的雷达: http : //openradar.appspot.com/19563577

解决方法很简单但不令人满意:稍微延迟一下演示,以避免引起减速的任何有争议的行为。

 dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:nav animated:YES completion:nil]; }); 

你应该从你的root vc模式显示它(例如:customTabBarRootViewController)。 保存一个参考,并使用参考控制器来显示它。

Swift中的解决scheme3

在SampleSelectorViewController(呈现的视图控制器)中使用下面的代码

 DispatchQueue.global(qos: .background).async { // Write your code } 

tableView:didSelectRowAtIndexPath:呈现时,我也有这个奇怪的延迟tableView:didSelectRowAtIndexPath:看起来像一个苹果的错误。

这个解决scheme似乎工作正常。

 CFRunLoopWakeUp(CFRunLoopGetCurrent()); // Fixes a bug where the main thread may be asleep, especially when using UITableViewCellSelectionStyleNone