2010-05-13 2 views
2

A упрощение ...Общие ошибки NSNotification?

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

Когда арендатор имеет вопрос слесарного он поднимает NSNotification:

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

Каждая квартира отслеживающего уведомления только от его собственного текущего арендатора (это устанавливается, когда квартира строится, до того, как текущий арендатор):

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

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

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

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

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

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

ответ

3

Ключ немного здесь:

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

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

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

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

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

+0

Интересно. Что делать, если я могу гарантировать, что всегда будет текущийTenant, когда уведомление будет опубликовано? currentTenant часто меняется, но всегда есть одно. –

+1

Не имеет значения, когда уведомление отправлено, но когда вы регистрируетесь для уведомления. Если текущий арендатор равен нулю, вы регистрируетесь для всех уведомлений PlumbingIssue от всех арендаторов, которые могут его отправить. В основном, когда арендатор переходит, зарегистрируйтесь для его уведомлений; когда он уходит, удалите себя от них. –

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