NSNotificationCenter Добавить? - PullRequest
       10

NSNotificationCenter Добавить?

1 голос
/ 18 апреля 2011

У меня два представления, что когда вы переключаетесь с одного на другое, они вызывают уведомление для представления, которое должно быть загружено для обновления содержимого. Странно то, что при первой загрузке представление вызывает его один раз, в следующий раз - дважды и так далее. Я пришел к выводу, что это потому, что они продолжают добавляться каждый раз при загрузке представления. Так как dealloc никогда не вызывается, он все еще там, и он будет продолжать добавлять сейчас.

Так есть ли способ проверить, существует ли уведомление перед добавлением, чтобы исправить эту проблему?

Вот что у меня есть в моем представлении DidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadGridNotification:) name:@"ReloadOHGridView" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadBadgeNotification:) name:@"reloadBadge" object:nil];

И моя сделка:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Спасибо!
Коултон

РЕДАКТИРОВАТЬ 1:

Я показываю свои представления в UINavigationController и переключаюсь между ними. Вот мой код, чтобы обновить другое представление:

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadBadge" object:self];
}

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

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

Если ваше представление по какой-либо причине выгружается, а затем перезагружается, тогда viewDidLoad будет вызываться снова.Ваш removeobserver не будет вызываться до тех пор, пока объект не будет уничтожен, что может объяснить, почему ваш removeobserver не работал.

Вы должны либо проверить, вызывали ли вы addObserver с флагом, либо вручную удалить наблюдателя с помощью removeObserver, когдавы выгружаете свое представление в методе viewDidUnload.

Edit1: в качестве альтернативы, вы можете добавить наблюдателей где-нибудь еще, как в App Delegate?

0 голосов
/ 18 апреля 2011

Когда объем памяти будет ограничен, ОС выведет ваш обзор, но сначала вызовет viewDidUnload;когда он должен перезагрузить их, он вызывает viewDidLoad.dealloc, однако, вызывается только тогда, когда все ссылки на ваше представление были освобождены, что, вероятно, не произойдет, пока ваше приложение не закроется.

В результате, как заметил @utureelite7, вы добавляетеновый наблюдатель каждый раз, когда ваш вид перезагружается, но, по сути, никогда не удаляет его.

Все, что вам нужно сделать, это убедиться, что наблюдатель добавлен в viewDidLoad и удален в viewDidUnload, у вас не будетпроблема множественных уведомлений.Нет необходимости в флаге или в размещении наблюдателя где-либо еще.

Из ваших комментариев кажется, что вы, возможно, попробовали его, но я предлагаю пройтись по своему коду и убедиться, что вы только добавляете их в DidLoadи всегда удаляем их в DidUnload.Он работает как приложение в приложении после приложения.


Отредактировано для добавления

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

...