Распространенные ошибки NSNotification? - PullRequest
2 голосов
/ 13 мая 2010

Упрощение ...

В здании есть множество жилых объектов. Каждая квартира имеет одного действующего арендатора. Эти арендаторы имеют тип лица. Обратите внимание, что currentTenant не имеет ссылки на квартиру, поэтому не может отправить информацию обратно по цепочке.

Когда у арендатора возникает проблема с сантехникой, он поднимает NSNotification:

[nc postNotificationName:@"PlumbingIssue" object:self];

Каждая квартира получает уведомления ТОЛЬКО ОТ своего собственного текущего арендатора (это настраивается, когда квартира построена, до того, как появится текущий арендатор):

[nc addObserver:self selector:@selector(alertBuildingManager:) name:@"PlumbingIssue" object:[self currentTenant];

Когда квартира получает уведомление от своего текущего currentTenant, она отправляет свое собственное уведомление "PlumberRequired" вместе с номером квартиры и currentTenant в NSDictionary.

Квартира следит за этими уведомлениями, которые она будет получать из любой квартиры (или другого объекта):

[nc addObserver:self selector:@selector(callPlumber) name:@"PlumberRequired" object:nil];

Есть ли что-то, что я мог бы сделать здесь в корне неправильно? То, что происходит, - то, что квартира получает уведомления от любого и всех текущих арендаторов, а не только его собственное.

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

1 Ответ

3 голосов
/ 13 мая 2010

Ключевой бит здесь:

Каждая квартира наблюдает уведомления ТОЛЬКО ОТ своего собственного текущего арендатора (это настраивается при строительстве квартиры до того, как появится текущий арендатор)

Если нет currentTennant, то ваш код фактически делает это:

[nc addObserver:self selector:@selector(alertBuildingManager:) name:@"PlumbingIssue" object:nil];

Когда вы используете nil в качестве параметра объекта, вы сообщаете NSNotificationCenter, что вы хотите, чтобы все PlumbingIssue оповещения были доставлены этому наблюдателю. Что вам нужно сделать, так это убедиться, что вы настроили уведомление только тогда, когда у вас есть currentTennant. Если вы используете свойства, setCurrentTennant:, вероятно, будет хорошим местом для этого.

Обязательно удаляйте себя в качестве наблюдателя при изменении currentTennant и всегда обязательно удаляйте свой объект в качестве наблюдателя полностью, когда он освобожден (иначе NSNotificationCenter может попытаться отправить уведомления на освобожденный объект, очень плохая вещь). - [NSNotifcationCenter removeObserver:] - самый простой способ сделать это.

...