現象
- TableViewCellをタップしてからModalにViewControllerが表示されるまで時間がかかることがある
- 1秒以上待たされることがある
状況
根本原因がつかめていないため、発生時の状況を記載する。以下に当てはまらない場合でも発生するかもしれない。
- Modal表示するViewController(以下、ViewController)は
performSegueによって表示される - ViewControllerの表示には、2つの経路がある
- TableViewCellをタップしたときに
performSegueを呼ぶ - 別途あるボタンをタップしたときに、IBActionの処理にて
performSegueを呼ぶ
- TableViewCellをタップしたときに
- TableViewCellをタップしたときだけ、ViewControllerがモーダル表示されるまでに時間がかかることがある
-
viewDidLoadからviewWillAppearまで1秒以上かかっていた(5秒以上かかることも) - 描画先のViewControllerは、特に大きな初期化処理をしていない
-
-
tableView(_:didSelectRowAt:)は、メインスレッドで実行されていた -
IBActionでperformSegueをしても遅くならない
解決法
stackOverflowにて、「俺を信じて試してみてくれ」とある。
ios - performSegueWithIdentifier very slow when segue is modal - Stack Overflow
実際に試したところ、スムーズに描画されるようになった。
// Swift3 記法
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
DispatchQueue.main.async {
self.performSegue(withIdentifier: "showModal", sender: indexPath)
}
}
所感
- なぜ
didSelectRowAtでperformSegueを呼び出すと問題が起こるのだろうか - performSegueは同期的な処理なのだろうか