27

私はにとに使用さaddObserverviewDidLoad:ます。コード:removeObserverdealloc:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

しかし、いくつかの記事によると、addObserverinviewDidAppear:removeObserverinの方が良いとのことviewDidDisappear:です。コード:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData)
                                                 name:AnyNotification
                                               object:nil];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AnyNotification
                                                  object:nil];
}

では、Observer を追加/削除するより良い方法は何ですか?

4

5 に答える 5

25

これはシナリオによって異なります。通常、最適なアプローチは、追加viewDidLoadと削除を行うことdeallocですviewDidUnload(iOS 9.0では非推奨、使用deallocのみ)が、UIエフェクトなどの異なるクラスに同じメソッドがあり、呼び出しのみを行う場合があります。通知を使用する現在の画面のメソッドでは、オブザーバーを追加してviewWillAppear削除する必要がありますviewWillDisappearまたはviewDidAppear/viewDidDisappear

編集: コメントからのメモ、@honeyに感謝します。

iOS 9以降、オブザーバーを削除する必要はなくなりました。Appleのリリースノートを参照してください。「OSX10.11およびiOS9.0では、NSNotificationCenterおよびNSDistributedNotificationCenterは、割り当てが解除される可能性のある登録済みのオブザーバーに通知を送信しなくなりました。

于 2012-05-17T07:15:40.683 に答える
4

ビューが実際に表示されている場合にのみ、私が遭遇したすべてのケースで通知にのみ関心があるため、通常はそれを-viewDidAppear:and -viewDidDisapear:(または-viewWillAppear:and ) に入れます。-viewWillDisappear:

おそらく時期尚早の最適化です(通知を処理するためのコードには時間がかかる可能性がありますが、ビューが表示されない場合は役に立たない可能性があります)が、それ以上のコードではありません-同じコードが異なる方法であるだけです...

于 2012-05-17T07:21:00.330 に答える
0

NSNotifications を使用する最善の方法は、通知を監視する必要があるときにオブザーバーを追加し、不要になったときにそれらを削除することです。

これはviewDidLoad:、 、viewWillAppear:、またはユーザーがボタンをタップしたときなどです。

少し例を挙げます。

私のアプリにはタブバーがあり、一部のビュー コントローラーでは、インターネットからダウンロードした情報 (ツイートなど) を表示しています。サーバーからの新しいデータを2分ごとにプールするクラスもあり、サーバーに新しいデータがあったため、データベースの情報を更新しました。データを表示するビュー コントローラーが非常に多いため、デリゲート パターンを使用して DB の変更をリッスンしません。これは、デリゲートを配列にしてループし、すべてのビュー コントローラーにデータを渡す非常に悪い設計になります。したがって、この特定のシナリオでは、すべての VC に新しいデータが来たことを知らせる通知を投稿するのが最善です。

ビューが消えたときに VC がデリゲートを削除すると、現在のデリゲートのみが通知を受け取り、表示内容を更新します。

たとえば、表示する前に他の VC のコンテンツを更新することもできますがviewWillAppear:、これを行うと、必要なときだけでなく、タブを変更するたびに VC のコンテンツが更新されます。

NSNotifications の場合、アプリの動作に関する完全な説明がない場合、オブザーバーをいつ追加または削除するかをアドバイスするのは難しいことをお見せしようとしたのは 1 つの例にすぎません。

于 2016-05-19T07:18:13.510 に答える