2013-08-31 29 views
3

我已經創造了A類的通知像如何在另一個類中去除noitification觀察者?

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodcalled:) name:@"ViewChanged" object:nil]; 

我張貼此通知與名B類像

[[NSNotificationCenter defaultCenter]postNotificationName:@"ViewChanged" object:nil]; 

現在我想在講座除去像下面這個通知C。可能嗎?因爲我需要從class-c去甲班。

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ViewChanged" object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:nil name:@"ViewChanged" object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

我試過了,但通知沒有刪除,它的調用兩次。 如何爲NSNotificationCenter創建對象?

+3

C爲什麼要管理A的觀察?爲什麼不是A爲自己做呢? – Wain

+1

您需要對該對象(類A的實例)的引用才能使用removeObserver:instanceOfObjectOfClass-A。 – user523234

+0

@是的,在從C到A之前,我想刪除A的觀察者,否則將會是另一個觀察者。現在,當我從C到A時,該方法正在調用兩次。 –

回答

0

正如@Wain正確地說,這是怪異/錯誤的設計。買,如果你真的想,你需要做的:

[[NSNotificationCenter defaultCenter] removeObserver:objectA name:@"ViewChanged" object:nil]; 

所以objectA是你作爲self過去了,當你叫addObserver:的對象。你現在需要得到objectA到C類的實例,這表明你試圖做的是錯誤/奇怪的。

+0

不,這會增加耦合,因爲C必須知道A. –

+0

@Pétur是的我知道,這就是爲什麼我說這很奇怪。我認爲,如您所暗示的那樣,僅僅爲了刪除另一個目的而添加通知會造成更大的混亂。 –

+0

@Pétur,C怎麼知道A? –

2
[[NSNotificationCenter defaultCenter] removeObserver:nil name:@"ViewChanged" object:nil]; 

以來的第一個參數removeObserver您的代碼不工作是零,如文檔中說明。

- (空)removeObserver:(ID)notificationObserver名稱:(* NSString的)notificationName對象:(ID)notificationSender

notificationObserver

觀察員從調度表中刪除。指定觀察者僅刪除該觀察者的條目。不得 爲零,否則郵件將無效。

一種可能的解決方案:

objectA可以監聽第二通知,如removeA。然後在objectA內創建一個方法,作爲ViewChanged的觀察者刪除objectAremoveA應該觸發該方法。

objectC然後只需發佈removeA通知和objectA將停止收聽。

+0

僅僅爲了移除另一個目的而發出通知是一個相當有限的解決方案。 –

+0

這是我最好的嘗試。 @ G.Ganesh暗示他已經在他的設計中引入了_Mediator Pattern_,表明需要_message耦合(低耦合)_。除非_communicational cohesion_是一個問題,否則我認爲我提出的解決方案在上下文中是有效的。 –