3

オブジェクトは一度に1つのデリゲートしか持てないことを読みました。しかし、それは本当に本当ですか?

プロトコルを使用してオブジェクトを作成し、そのオブジェクトから他のいくつかのオブジェクトから多くのデータを収集するとします。プロトコルに準拠するすべてのオブジェクトを配列に追加します。次に、それをループして、すべてのデリゲートでメソッドを呼び出します。

NSMutableArray *collectFromDelegates = [NSMutableArray alloc]init];

//in delegateArray I keep pointers to every delegate.
for(id delegate in delegateArray){
  [collectFromDelegates addObject:[delegate someProtocolMethod]];
}

これは間違っていますか?

4

7 に答える 7

9

それは実際には委任ではありません。

委任は、プログラム内の1つのオブジェクトが別のオブジェクトに代わって、または別のオブジェクトと連携して動作する、単純で強力なパターンです。委任オブジェクトは、他のオブジェクト(委任)への参照を保持し、適切なタイミングでそのオブジェクトにメッセージを送信します。このメッセージは、委任オブジェクトが処理しようとしている、または処理したばかりであることをイベントの委任に通知します。

イベントはすでに処理されているため、複数のオブジェクトでイベントを処理することはあまり意味がありません。複数のデリゲートがあることがわかった唯一の理由は、最初のデリゲートがイベントの処理に失敗した場合、次のデリゲートに渡され、オブジェクトがイベントを処理するまで続行できるためです。

この例では、オブジェクトはデータソースとして機能しています。これは複数のデリゲートよりも理にかなっていますが、単一のデータソースに複数のオブジェクトからのデータを結合させることで簡単に実装できます。つまり、データを要求するオブジェクトは、データの結合方法について心配する必要がありません。

複数のオブジェクトが必要になることが多いもう1つのケースは、イベントの通知を受信することです。オブジェクトはオブジェクトに対して機能しておらず、オブジェクトに発生した何かに作用するだけなので、これは委任ではありません。これは、通知または監視を使用してより適切に実装されます。

于 2012-04-25T16:00:03.207 に答える
1

Appleの慣例では、「デリゲート」オブジェクトは1つだけです。ただし、必要に応じて、デリゲートの配列を持つように独自のクラスを設定できます。わかりやすくするために、それらを別の名前で呼び出すことをお勧めします。

あなたの例では、それらを「dataSources」と呼ぶ方が適切かもしれません。

于 2012-04-25T15:52:34.147 に答える
1

デリゲートは単なる抽象的な概念です。必要な数のデリゲートを持つことができます。ただし、これが必要になることはめったになく、パターンが悪いことがよくあります。

sourceAppleはaとdelegateパターンをうまく利用しています。ソースivar(デリゲートの形式)はデータを提供し、デリゲートivarは論理応答のために呼び出されます。おそらくこれはより良い解決策ですか?

NSNotificationまたは、を使用して、単一のイベントを多くのリスナーに通知することもできます。

お役に立てれば!

于 2012-04-25T15:53:31.110 に答える
1

別の問題を解決しているデリゲートが複数ある場合、クラスに必要なデリゲートは1つだけです。デリゲートパターンは、クラスの動作を変更するために使用されます。たとえば、吠えることができる犬のクラスがありますが、さまざまな種類の犬がさまざまな方法で吠えるとします。代理人は、吠える行動を変える1つの方法です。

クラスが行っていることを観察することにおそらくもっと興味がある複数のものが必要な場合は、現在のイベントを他の人に通知する必要があります。他のいくつかのクラスが1つの動作に関心がある可能性があるため、配列が必要になります。iOS SDKでは、これは通知を使用してすでに実行されています。これはオブザーバーパターンと呼ばれます。

さまざまなユースケース...

于 2012-04-25T15:55:39.890 に答える
1

オブジェクトは一度に1つのデリゲートしか持てないことを読みました。しかし、それは本当に本当ですか?

どこで読んだの?いいえ、それは真実ではありません。たとえば、UITableView2つのデリゲートがあり、1つはデータを提供し、もう1つはアクションを処理します。

于 2012-04-25T16:05:15.640 に答える
0

一般に、クラスの機能に関心のある複数のクラスにメッセージを送信する場合は、NSNotificationsを使用します。ただし、通知のにメッセージを送信することを許可しない限り、データを返すことはできませんobject。しかし、それがよりクリーンな解決策になるかどうかはわかりません。

于 2012-04-25T15:51:03.780 に答える
0

上記の通知以外の1つのアプローチは、デリゲート実装がプロトコルに準拠するオブジェクトの配列を保持し、これに対してラッパーとしてプロトコルメソッドを呼び出すことです。

于 2012-04-25T15:55:02.230 に答える