21

これは、時間を節約するために他の人に警告するほどの質問ではありません。

iOS 3 / iPhone OS 3のNSNotificationCenter(Mac OSXおよびiOS4も想定しています)の動作は次のとおりです。

正確な特定の通知を複数回登録すると、NSNotificationCenterは冗長性を認識せず、代わりに、監視を登録した数の通知を送信します。

これは、ほとんどの場合、見たい動作ではなく、ほとんどの場合、偶発的なものです。

例:

新しいデータが着信したときに、ViewControllerがシングルトンネットワークオブジェクトから通知を受信するようにしたい。

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

しかし、以前はすでに同じものを入れていましたviewWillAppear

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

これはまったく同じ通知であり、同じオブザーバー、送信者、および通知名に解決されることに注意してください。

この場合、これらのaddObserver呼び出しのいずれかを削除しないと、ViewControllerに重複した通知が届きます。

マルチスレッド環境では、これは傷ついた世界です。私を信じて。

このようなことに遭遇した他の人がいる場合に備えて、これをそこに置くだけです。

4

3 に答える 3

3

iOS 3/iPhone OS 3 (Mac OS X および iOS 4 も想定しています) の NSNotificationCenter には、次の動作があります。

正確な特定の通知に対して自分自身を複数回登録すると、NSNotificationCenter は冗長性を認識せず、代わりに、観察を登録した数だけ通知を送信します。

これは、見たい動作であることがほとんどなく、ほとんどの場合、偶然です。

例:

新しいデータが入ってきたときに、View Controller がシングルトン ネットワーク オブジェクトから通知を受け取るようにします。

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

しかし、以前はすでに同じものを入れていましたviewWillAppear

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

これはまったく同じ通知であり、同じオブザーバー、送信者、および通知名に解決されることに注意してください。

この場合、これらの addObserver 呼び出しのいずれかを削除しないと、View Controller に重複した通知が届きます。

マルチスレッド環境では、これは苦痛の世界です。私を信じて。

このようなことに出くわした人が他にいる場合に備えて、これをそこに置いてください。

于 2013-04-21T02:18:49.603 に答える
2

オブザーバーを常にクリーンアップする必要があります。
これを行う最も簡単な方法は次のとおりです: [[NSNotificationCenter defaultCenter] removeObserver:self]
viewDidLoad はオブザーバーを追加するのに適した場所ではありません。addObservers を viewWillAppear に配置し、removeObservers を viewWillDisappear に配置するのに適した場所です。

于 2013-01-24T07:31:48.347 に答える
0

あなたが自分で言ったように、NSNotificationCenter は重複をチェックしません。

特定のオブジェクトにターゲットを追加する場合も同じロジックが適用されますが、多くの場合、それらには重要な認識があります。

洞察と、SEO に適した適切な警告をありがとう:)

于 2012-12-29T10:43:32.590 に答える