0

classAオーディオ入力を何度もサンプリングするオーディオのクラスであるとしましょう。新しいデータを取得するたびclass Aに(1秒間に何度も発生する可能性があります)、彼は別のクラスに通知する必要がありclassBます。

class B これで、 inのインスタンスをclassA作成し、新しいデータが到着したときにBを呼び出すことができますが、これはモジュラーソフトウェアではありません。

classAは外部に「盲目」になり、すべてのプロジェクトに彼を追加し、何らかの方法で彼を支援する別のプロジェクトをclassB作りregisterたいので、Aが何か新しいものを持っているとき、Bはそれを知っています(AがBを呼び出さなくても!)

Objective Cでどのように正しく行われたのですか?

どうもありがとう 。

4

3 に答える 3

5

オブザーバーパターンを実装したいようです

于 2012-02-26T14:55:33.507 に答える
3

に通知を投稿し、他のクラス(つまり)にその通知をClassA登録できますClassB

これがあなたがそれをすることができる方法です:

(でClassA):

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"noteName" object:self];

(でClassB):

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doSomething:)
name:@"noteName" object:nil];

ClassAインスタンスが新しい通知を投稿するたびに、その通知に登録されている他のインスタンスに(即座に)通知されます。この場合、ClassBを実行しますdoSomething:(NSNotification *)note


[編集]

その通知をセッターメソッド(setVar:(NSString*)newVar)に投稿できます。

何かを伝えたい場合は、postNotificationName:object:userInfo:バリアントを使用してください。userInfoはでありNSDictionary、あなたはそれにあなたが望むものを何でも渡すことができます。例えば:

NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:var, @"variable", nil];
[[NSNotificationCenter defaultCenter]
postNotificationName:@"noteName" object:self userInfo:dic];

doSomething:ここで、メソッドを編集します。

-(void)doSomething:(NSNotification*)note {
    if ([[note name] isEqualToString:@"noteName"]) {
        NSLog(@"%@", [note userInfo]);
    }
}

詳細: https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html

https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/MacOSXNotifcationOv/Introduction/Introduction.html

于 2012-02-26T15:12:52.180 に答える
2

ennuikillerが示唆したように、obj-cでオブザーバーパターンを実装する簡単な方法は、NSNotificationCenterクラスを使用することです。詳細については、そのクラスリファレンスを参照してください

編集

もう1つの方法は、KVO(Key Value Observing)を使用することです。これはより複雑ですが、最初のものよりもパフォーマンスが優れています。簡単な説明については、JeffLamarcheブログKVOリファレンスを参照してください。

それが役に立てば幸い。

于 2012-02-26T15:00:07.080 に答える