責務超過になりやすいUIApplicationDelegate
What describes the Application Delegate best? How does it fit into the whole concept?
の投稿でも議論されていますが、自分も前々から気になっているので整理してみます。まだいろいろ書いてない事も有りますが。。。。
UIApplicationDelegateの行う仕事としてまず
・アプリケーションに関わる初期化。
・最初に表示するUIViewControllerの設定
があります。
次に以下のような外部アプリ?からのイベント、例えば
・URLスキーム
・音楽アプリの場合、コントロールセンタから再生制御イベント(要UIResponderを継承)
を適切なオブジェクトに投げるというのがあるでしょう。
三番目として下位レイヤー、主にモデル系クラスから飛んでくる通知(NSNotification)、例えば
・通信エラー
・セッション切れ
を受けて適切なアクションを起こすというのが有るでしょう。ただ、これはクラスの役割分担の観点から実際に処理すべきクラスに処理をさせるべきでしょう。アラート表示はiOS8から新しく変わりますが、UIApplication→window→rootViewController経由でモーダル表示させれば、専用のクラスで対応できそうです。
4番目としてシステムイベント、例えばバックグランドに遷移した、アプリが終了する等の処理が有るでしょう。通知(NSNotification)で配信される場合、これもクラスの役割分担の観点から、適切な責務を担っているクラスに処理をさせるべきでしょう。
ただ、UIApplicationDelegateのメソッド経由でしか通知されないイベントについては受け手にならざるえません。その場合でも、実際の処理は専用のクラスにおこなわせて、UIApplicationDelegateは仲介役に徹するべきでしょう。UIViewController系クラスと同様な
仲介タスクですね。
とりあえず強引に纏めますが
・UIResponder経由やUIApplicationDelegateのメソッドとしてしか用意されていないものはUIApplicationDelegateクラスで受けて、他のクラスに転送する。
・通知が用意されているイベントについてはその専用のクラスに処理させる
という事でしょうか? クラスの責務を考えて、積極的に分割しないと簡単に神クラスができるのでUIApplicationDelegateについては色々考えたい所です。