2017-01-30 7 views
0

監督者の場合:私はこの質問を に依頼する前に多くを検索しましたが、私は何をしたいのか正確には分かりませんでした。通知センターまたは閉鎖?

私の質問は:NotificationCenterを使用し、2つのインスタンス間の通信にClosuresを使用しての間で優れていますか? 類似している場合はどうすればよいですか?

うまくいけば、この例では、あなたがよりよく理解するのに役立ちます: - 私たちは一例としてURLSessionクラスを取る場合

を。なぜそのメソッドのほとんどはクロージャを持っていますか?彼らはData, Response, and Errorの通知をなぜ送信しないのですか?

私はそれらの違いを知っています私はちょうど私がそれぞれの状況をどのような状況で使うべきかわかりません。

+0

閉鎖に反対するコールバックを意味しますか? –

+0

@ RyanH。私が意味することは、閉鎖を使用していつも同じ結果を達成できるかどうか、いつ、どのような状況で通知センターを使用するべきか(投稿および観察通知)です。 – 3li

答えて

2

いくつかのケースではパターンが交換可能である、しかし:クロージャを使用

  1. は、2つのオブジェクト間の複雑な通信がある場合にデリゲートを使用した単純なケース
  2. の最も簡単な解決策は一般的です。 1つのデリゲートは、多くのクロージャより優れています。
  3. 複数のオブザーバーがいる場合や、どのオブジェクトが観察されるのかわからない場合は、通知を使用する必要があります。

なぜ簡単なケースでクロージャを使用しているのか、代理人や通知ではないのか、あなた自身が尋ねているかもしれません。答えは、クロージャが最も軽量であることです。それらは簡単に作成でき、コード品質にもプラスの影響を与えます。

完了コールバックを考えてみましょう。通知を使用する場合は、その通知を処理する別の方法が必要です。代理人にも同じことが当てはまります。コンテキストを必要とする場合(アクションを引き起こしたパラメータなど)、プロパティに保存する必要があります。

一方、クロージャをインラインで作成することができます。つまり、アクションをトリガーしてその結果を処理するコードは、です。です。これにより、コードの構造が簡単になります。また、クロージャがいくつかのコンテキストを必要とする場合、追加のプロパティを作成する必要はなく、クロージャがそれを取得できることにも注意してください。

+0

あなたの有益な答えをありがとう。 「単純なケース」と「複雑なコミュニケーション」の意味について詳しく説明できますか? – 3li

+1

@ 3liシンプルなケースは完了コールバックです(つまり、オブザーバに送信される情報はシンプルです。たとえば、結果オブジェクトで、一度だけ呼び出されます)。あなたが 'UITableView'デリゲートを見ると、複雑なコミュニケーションの例が見えます。複数回コールできる20個のコールバックがあります(例えば、 'didSelect')。複数のクロージャを使用すると、非常に複雑になります。不可能ではなく、複雑です。クロージャは軽量で使用するのが最も簡単ですが、オブジェクト間のやりとりが複雑すぎると、委譲が答えです。 – Sulthan

+0

ああ、私は今それを得る。どうもありがとうございます! ❤ – 3li

関連する問題