2010-05-13 47 views
2

簡化...常見的NSNotification錯誤?

建築物有一個公寓對象的數組。每個公寓都有一個currentTenant。這些租戶是Person類型的。請注意,currentTenant沒有對公寓的引用,因此無法將信息發回鏈接。

當租客有一個管道的問題,他提出了一個NSNotification:

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

每間公寓遵守通知只能從它自己目前的租戶(這是建立在公寓建成時,之前還有一個目前的租戶):

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

當公寓從它自己的currentTenant收到通知時,它發送它自己的通知,「PlumberRequired」,與公寓號碼和一個NSDictionary的currentTenant一起。

公寓觀察這些通知,它會從任何公寓(或其他物體):

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

有什麼我可以得到根本上的錯誤嗎?現在發生的事情是,公寓正在接收來自任何和所有currentTenants的通知,而不是它自己的。

對不起,實際的代碼有點太難以發佈。只是想知道在觀察來自特定發件人的通知方面是否存在差距?

回答

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頻繁更改,但總是有一個。 – 2010-05-14 00:09:26

+1

通知發佈時,但註冊通知時無關緊要。如果當前租戶爲零,則您將註冊所有可能發送租戶的所有租戶的所有PlumbingIssue通知。基本上,當房客入住時,註冊他的通知;當他搬出去時,將他們從他們身上移開。 – 2010-05-14 02:24:32