10

次のコードがあります。

 [[NSNotificationCenter defaultCenter] postNotificationName:kNewsfeedFetchCompleted object:self userInfo:userinfo];

これだけで、他にはありません。そして、オブザーバーを設定する方法は次のとおりです。

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil];

質問は、1 つの投稿を行うと、newsfeedFetchCompleted が 2 回呼び出されることです。これはどのように可能ですか?

4

3 に答える 3

24

これは、addObserver のコードが 2 回実行された場合に発生する可能性があります。通知関数は、登録されている回数だけ呼び出されます。

したがって、オブザーバーを追加するためのコードが一度だけ実行されるようにしてください。したがって、viewDidLoad または init メソッドで保持できます。

それをviewWillAppearに入れている場合は、viewWillDisAppearでオブザーバーを削除してください。

于 2012-06-29T05:18:43.877 に答える
7

オブザーバーを追加する前に、前に追加したオブザーバーを必ず削除してください。

[[NSNotificationCenter defaultCenter]removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil];
于 2012-06-29T05:18:25.100 に答える
2

newsfeedFetchCompleted通知に同じオブザーバーを複数回追加した場合に可能です。addObserver 呼び出しと removeObserver 呼び出しを一致させる必要があります。

たとえば、UIViewController の viewWillAppear/viewWillDidAppear/ViewDidLoad にオブザーバーを追加した場合は、viewWillDisappear/viewDidDisappear/ViewDidUnload でそれを削除する必要があります。

addObserver の対応する remove 呼び出しは次のとおりです。removeObserver:name:object:

詳細については、NSNotificationCenter のドキュメントを参照してください。

于 2012-06-29T05:17:48.827 に答える