2012-06-29 4 views
9

У меня есть следующий код:NSNotificationCenter один пост вызывает наблюдателей назвать дважды

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

только в этом, ни где-либо еще. И вот как я устанавливаю наблюдатель:

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

вопрос, когда я один пост newsfeedFetchCompleted вызывается дважды .. как это возможно?

+0

[[NSNotification defaultCenter] removeObserver: self] – janusbalatbat

+0

Что вы имеете в виду? почему я должен это делать? – xonegirlz

+2

AddObserver может вызываться более одного раза для одного и того же объекта, что приводит к нескольким уведомлениям. Где вы вызываете addObserver? –

ответ

23

Это возможно, если ваш код для addObserver выполняется дважды. Функция уведомления будет вызываться столько раз, сколько будет зарегистрирована.

Поэтому убедитесь, что ваш код для добавления наблюдателя выполняется только один раз. Таким образом, вы можете сохранить его в методе viewDidLoad или init.

Если вы положили его в viewWillAppear, тогда удалите наблюдателя в viewWillDisAppear.

+0

Я фактически добавил это в имя initWithNib – xonegirlz

+0

В этом случае, когда вы освобождаете этот диспетчер просмотра, вы пропустили removeObserver в методе dealloc. – Apurv

+0

Итак, если контроллер просмотра создается второй раз, ваш наблюдатель снова зарегистрируется, и функция вызывается дважды. – Apurv

2

Возможно, если вы добавили один и тот же наблюдатель несколько раз для уведомления newsfeedFetchCompleted. Вы должны соответствовать вашим вызовам addObserver с вызовами removeObserver.

Например, если вы добавили наблюдателя в viewWillAppear/viewWillDidAppear/ViewDidLoad из UIViewController, его следует удалить в viewWillDisappear/viewDidDisappear/ViewDidUnload.

Соответствующий удалить вызов для addObserver, является removeObserver:name:object:

Более подробную информацию можно найти в NSNotificationCenter docs

8

, прежде чем добавить наблюдатель, убедитесь, что вы удалите добавил предыдущий наблюдатель.

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

У этого должно быть больше голосов. Действительно помог мне исправить проблему, когда мой метод вызывался слишком много раз. –

Смежные вопросы