2012-01-31 13 views
5

私は、Webサービスへのインターフェイスであるオブジェクトを作成しました。 1つの典型的なオブジェクトは "TaskService"であろう。クライアントがこれらのオブジェクトのいずれかを使用すると、サービスのメソッド(GetTasksなど)の1つが呼び出され、サービスが非同期的にオフになり、リモートWebサービスが呼び出され、取得されたデータがデリゲートを介してポストバックされます。デリゲートとシングルトン:良いアイデアか悪い?

現在

、[初期化] [TaskServiceのalloc]でそれを作成するためにあなたが持っているこれらのサービスのいずれかを使用するには、私はそれがシングルトンオブジェクトに各サービスを作るために、より理にかなっていることを決めました。

デリゲートへの参照を保持するシングルトンオブジェクトを参照するのは一般的ですか?私の主な問題は、それぞれのオブジェクトが、特定のサービスの使用を必要とするときは、サービスを呼び出す前にデリゲートとして設定しなければならないということです。代理人として自分自身を設定し、サービスを呼び出す間に代理人として自分自身を設定することでしたか?

事前に感謝します。

よろしく、 ニック

答えて

4

芋これはあなたが引用した理由のために良いアイデアではありません。シングルトンのパターンは実際には1つだけのものですが、あなたのアプリはこれらのサービスの複数のインスタンスを必要とするように思えます。私はあなたが本当にサービスの複数のインスタンスをインスタンス化する必要があるときに、この(操作キューまたは何らかの種類のデリゲートマルチプレクサを使用して)を回避しようとしていると思います。

+0

私は、デリゲートのマルチプレクサは(いくつかの並べ替えの放送局?)ですが、私は試してみて実装することがあまりにも複雑に聞こえるので、私は試してみて、そのような何かを明確に滞在されますどのような見当がつかない!操作キューを実装するには、すべてのメソッドが引数としてデリゲート/パラメータを取らなければならないと考えるのは間違いありませんか?「要求」がキューに入れられると、関連付けられた代理人は完了したら呼び出すことができますか? –

+0

デリゲートマルチプレクサは、シングルトン内に記述するコードを補完した用語です。与えられた結果を送るデリゲートを特定します。オペレーションキューは、各オペレーション(デリゲートのフェッチと通知)をよりよくカプセル化します。したがって、リクエストはこのようにキューに入れられます。 – Rayfleck

4

シングルトンオブジェクトの使用が正当な理由である場合は、あなたが引用した理由で、私はいつも委任を避けます。シングルトンの消費者は、シングルトンの1人のみのデリゲートとして自分自身を設定することによって、他の消費者の足指に踏み込んでいるかどうかを知ることができません。 NSNotificationsは仕事のためにはるかにクリーンなツールです。任意の数のリスナーが、誰がリスニングしているかを気にせずに通知を消費することができます。

委任は、クラス間に明確な所有権がある場合に最も効果的です。誰もシングルトンを所有していません。

+0

私は、NSNotificationsについてよく知らないので、それを見なければなりません。ただし、他の言語のコンセプトと似ているかもしれませんが、「リスナー」がリストに追加され、各リスナーに特定のイベントが通知されることはよく知られています。これは私に合っていると思うので、チップに感謝します。 –

+0

(マットのつま先を離してはいけませんが...)はい、NSNotificationsはリスナーに似ています(私たちはオブザーバーと呼んでいます)。 IMO、今週は1つのテクニックしか学ばなければ、それはそうだろう - 彼らは、特に結合しないクラスとそれぞれのタスクで、非常に便利です。 – Rayfleck

+0

チップをありがとう。すぐにNSNotificationをチェックします! –

0

シングルトンは本当に問題ではありません、あなたは単にクラスをインスタンス化し、グローバル変数などについては、それを渡すことによって、問題の同じ種類を引き起こします。 他にもキューがあると言われていますが、シングルトン内のサービスでタスクを呼び出すと、そのメソッドとコールバックデリゲートを渡すTaskRequestオブジェクトがインスタンス化され、リクエストを互いに踏み合わせることはできません。とにかくそれをキューで行うのは良い考えです。

0

シングルトンのスコープはアプリケーション全体です。たとえば、ショッピングアプリケーションの例をロガーデータ、注文、支払い、カートなどのさまざまなアプリケーションでアクセスする必要があるユーザーIDについての例を考えてみましょう。

代理人は1対1の通信に使用され、例:テレビとリモコンの2つのクラスがあります。あなたはテレビのチャンネルを変更したい。チャネルを変更するためのテレビの委任方法は、リモートコントロールデバイスクラスで実装されています。あなたはリモコンのデバイスを使用し、あなたはテレビのチャンネルを変更します。

シングルトン委任パターンが1対1の通信のために通常使用されている間、複数の受信機と通信するために使用されます。

関連する問題