UITableViewControllerにはviewDidLoadとviewDIdAppearが用意されている。
この2つは似ているので使い分けが難しいし、大半のアプリでは使い分けなどせずとも特に問題にならないだろう。
しかし、私が今作っているアプリでは、ネット上のデータをダウンロードしてTableViewのセルに表示するものだが、ダウンロード処理は数秒の時間がかかる。
ダウンロード処理を実装する場所を、viewDidLoadにするかviewDidAppearにするかでアプリの快適さが全く違ったので、この辺りの教訓をまとめておこうと思う。
目次
viewDidLoadが呼ばれる時
XcodeでviewDidLoadを調べてみると以下のように記載されている。
Called after the controller’s view is loaded into memory.
ビューがメモリに読み込まれたときに呼ばれる。
よく分からない書き方だが、ビューがメモリに読み込まれる時とは、つまりアプリが起動した時だ。
segueなどで画面遷移を実装している場合で、他の画面から戻ってきたときには呼ばれない。
viewDidAppearが呼ばれる時
一方、viewDidAppearはどうだろうか。
Notifies the view controller that its view was added to a view hierarchy.
ビューヒエラルキーにビューが追加されたときにビューコントローラーに通知される。
こちらも意味不明な説明だが、このメソッドはアプリ起動時に呼ばれるだけでなく他の画面から戻ってきた時も呼ばれている。
重い処理はviewDidLoadで実装すべし
テーブルビューに表示するためのデータをインターネットからダウンロードする場合、viewDidLoadに実装しアプリの起動時のみ行えば良い。
私はこのダウンロード処理をviewDidAppearで実装していたのだが、毎回他の画面からテーブルビューへ遷移するたびに裏でダウンロード処理が行われており画面がフリーズしていた。
viewDidLoadの時点でデータをダウンロードしセルに格納しておけば、画面遷移のたびに同じ処理をする必要は全くない。