2009-06-04 5 views
3

最初のオブジェクト 'Controller'があり、参照用に 'self'を渡しながら 'Tasks'という別のオブジェクトを初期化します。 Tasksオブジェクトは、通信して、スーパー 'Controller'オブジェクトにメッセージを送信できるようになりました。これはオブジェクト間の通信に適していますか?これは通常どのように行われていますか?私はちょうどプログラミングについて本当に学ぶようになったので、これは大丈夫ですか?この時点まで、私は代理人と通知に頼ってきました。これはいい練習ですか?オブジェクト間の通信 - 別のオブジェクトへの自己継承/ Objective-C、Cocoa

例:

// Controller Object 
task = [[Task alloc] initWithController: self]; 
- (void) runMethod: (NSString *) incoming { 
NSLog(@"%@", incoming); 
} 

// Task Object 
- (id) initWithController: (Controller *) ctrlr { 
controllerPointer = ctrlr; 
[controllerPointer runMethod:@"hello"]; 
return self 
} 


// All this should print out "hello" 

とオブジェクトとの間の相互作用、通信の任意の他の方法がありますか?

答えて

7

これは通常、コントローラーオブジェクト(例ではController)とモデルオブジェクト(Task)が対話する通常の方法ではありません。 Model-View-Controller(MVC)パターンの解釈は多種多様ですが、一般的にコントローラオブジェクトはモデルを使用してコントローラが誰であるかを知り、直接通信することを期待するのではなく、モデルオブジェクトを観察またはクエリしますそれらと一緒に。

デザインによって、モデルオブジェクトとコントローラオブジェクトが不必要に緊密にリンクされます。たとえば、タスクの別のビューを管理するために2番目のコントローラを追加することにした場合、今後はどうなりますか?あなたのTaskオブジェクトは、複数のコントローラとの通信を管理する必要がありますか?かなりの数のモデルオブジェクトがある場合は、これで多くのコードを書くことになります。

ココアでは、モデルオブジェクトが残りのプログラムにとって重要なイベント(通知とキー値観測(KVO))をアナウンスする2つの主な方法があります。通知は簡単ではありません。名前と関連するモデルオブジェクトを使用して通知を作成し、それを共有NSNotificationCenterに投稿します。そこから、通知センターは、メッセージを購読するすべてのオブジェクトにメッセージを配信する責任があります。

KVOは説明が少し難しいです。基本的には、Cocoaにはオブジェクトの変更を検出し、更新された値を監視するクラスに直接送信するメカニズムがあります。 (KVOは、iPhone SDKに残念ながら存在しないココアバインディングの基盤の一部としても機能する)

これらの2つの手法は共通しているが、他のオブジェクトに通知するための一般的なメカニズムを提供するモデルオブジェクトで関心のあることが起こったことを示します。これらのオブジェクトがどのように対応するかは、完全に独自の判断です。

このように分離すると、コントローラオブジェクトとモデルオブジェクトが互いに依存しにくくなり、コントローラとモデルレイヤの間の特定のやりとりについてプログラマが心配する必要がなくなります。

2

これは良い方法ですか?

確かに。そうすることで何も問題はありません。

GCを使用していない場合は、Taskオブジェクトにコントローラオブジェクトを保持させるかどうかを検討する必要がありますが、指定した例では、 ControllerオブジェクトにはTaskオブジェクトが保持され、保持サイクルは不要です。

マイナースタイルコメント:controllerPointerを変数名として使用しません。私はちょうどcontrollerを使っています。

オブジェクト間の通信や相互作用の方法は他にありますか?

さて、特定のものではなく多数のオブジェクトが通知に関心がある場合は、適切な通知を使用して説明しました。 Taskオブジェクトがデリゲートがどのような種類のクラスに本当に関心がない場合は、デリゲートが適切です。

Controllerがシングルトンの場合は、Taskオブジェクトからこれを行うこともできます。

[[Controller sharedInstance] runMethod:@"hello"]; 

と言われていますが、コントローラを変数として保存する方がよいと思います。

1

私が最近行ってきたことは、あなたが指定したのと同じように、私が通信を処理するために構築したプロトコルを含んでいたことです。これにより、私はモデルとコントローラを100%有効な関心事に分けることができます。

#import <Foundation/Foundation.h> 


@protocol MMNotificationDelegate <NSObject> 
- (void)acquireForwardClass:(id)f_class; 
- (void)notifyForwardClass:(NSDictionary*)dict; 
@end 

私はちょうど私のクラスはMMNotificationDelegateを実装してください、と私は「最高」とストレートメソッドを介して行くこのルートを経由して通信を処理するクラスの中で「ダウン」に行く呼び出します。

関連する問題