私はこの2つを調べたところ、どちらも優れたコミュニケーション手段のようですが、通知は非常に扱いやすいようです。nsnotificationではなく委任を使用し、委任ではなくnsnotificationを使用したい状況は何ですか?
6 に答える
私は通常、サブシステム内のクラス間の委任を使用しますが、サブシステムの境界を越えて通知を使用します。これは、直接リンクする必要がなく、通知の厳密な順序が重要ではない場合です。また、クラスが(UITableViewのように)直接何かを行う必要がある場合は委任を使用し、通知機能に直接ではなく、独自の目的でアクションを実行する必要がある場合は通知を使用します。
通知は、たとえばサーバーへのログインが終了し、他の多くのサブシステムがタスクの実行を続行するためにOKを知る必要がある場合など、疎結合システムに適しています。これらのシステムはすべて、ログインサブシステムと直接の関係を持つ必要はないかもしれませんが、結果としてすべてが「何か」を行う必要があります。通知は、通知者が気にする必要がないため、委任者のように実装の形式を指示することもありません。
デリゲートは、通常、デリゲートが従わなければならないプロトコルの実装によって、実装を指示できる(「これを実行し、これを実行し、次にそれを実行する」など)、より緊密に結合されたシステムに適しています。関係がより明確に識別されるため、さまざまなコードがどのように連携するかを理解しようとしている場合にも、委任を追跡しやすくなります。
これもこのテーマに関する良い投稿です。
はい、NSNotificationsは独自のデリゲートプロトコルやメソッドよりも実装が簡単であることに同意します。2つの方法の相対的な「コスト」(時間またはメモリ使用量)が何であるかはよくわかりませんが、どちらか一方を使用するための基準は次のとおりです。
複数のクラスが3番目のクラスで行っていることを知る必要がある場合、それは「ブロードキャスト」であり、通知に登録するすべてのオブジェクトが情報を取得できるため、通知を使用します。
もう1つ通知を使用するのは、2つのオブジェクト、たとえばビューコントローラーがあり、それらがコントローラーのチェーン内またはチェーンの異なるブランチ上にあるため、自分で設定するコントローラーへの参照を取得するのが難しい場合です。の代理人として。
それ以外の場合、プッシュまたはセグエの準備のために1つのコントローラーが次のコントローラーを作成するときのように、2つのコントローラーが「近接」している場合、委任を使用して、プッシュされたビューコントローラーからプッシュを実行しているコントローラーに情報を戻します。
また、コントローラーが別のオブジェクトで何が起こっているかに基づいて複数のことを行う必要がある場合も、多数のメソッド(UITableViewDelegateなど)を持つデリゲートプロトコルを使用できるため、デリゲートの方が適しています。
委任は、UITableViewなどの多くのiOSビューで重要です。UITableViewには、UITableViewDelegateとUITableViewDataSourceがあります。テーブルの内容に関する情報を提供するには、両方が必要です。通知ではこれを行うことができませんでした。
委任が使用される他のいくつかの場所:
- averyアプリのアプリケーションデリゲートがあります:UIApplicationDelegate
- UIEditViewには、動作方法を指示するデリゲートがあります。
- UIAlertViewには、ユーザーのアクションをアプリケーションに戻すためのデリゲートがあります。
委任は通常、イベントの受信者の数が1または2に制限されている場合や、イベントの配信方法を制御する場合に役立ちます。たとえば、UIApplicationDelegateの例の場合、applicationDidFinishLaunchが完了するまで、applicationDidForegroundを呼び出すことはできません。そのため、次のイベントを配信する前に、受信者が各イベントを確認していることを確認します。begin、end、beginning、completeなどのライフサイクルに従わなければならないイベントを配信する必要がある場合は、デリゲートの方が適しています。
私の頭の中の通知は、データを一緒に渡すことができますが、ほとんどブールイベントのようなものです。受信者が誰であるかに関係なく、特定のイベントをブロードキャストする必要がある場合に役立ちます。通常、これは情報の変更を伝達する必要がある場合に役立ちます
まず、代理人は通知よりもはるかに高速であると言わなければなりません。プロジェクトに100の委任がある場合は問題ありませんが、100の通知になると、デバイスで簡単に殺害が遅くなる可能性があります。ただし、デリゲートには制限があります。オブジェクトに対して特定のタイプのデリゲートを1つだけ持つことができます。また、通知の場合、オブザーバーの数は一般的に制限されていません。さらに、デリゲートメソッドは、特定のメソッドを使用して異なるスレッドで実行しない限り、同じスレッドで実行される可能性があります。
ちなみに、どちらも素晴らしいコンセプトです。通知の処理は簡単です。特に、考えずに使用すると、保守不可能なコードを作成するのは非常に簡単です。
優れたアーキテクチャは、ほとんどの場合、それらがなくても生活できるようにする必要があります。
アーキテクチャ設計の欠陥を補うために通知が使用された、より大きなiPadプロジェクトを見たことがあります。それはひどいものでした。2か月後にコードを完全に保守できなくなります。
私の経験:これらは非常に便利なツールです-他のツールが失敗した場合に使用してください