2011-04-18 58 views
1

我有兩種觀點認爲,當你從一個切換到另一個時,他們會調用一個通知到即將加載的視圖來刷新內容。奇怪的是,第一次加載視圖時,它會調用一次,下次再調用一次,等等。我得出結論,這是因爲每次加載視圖時都會一直添加。由於dealloc永遠不會被調用,它仍然存在,它現在將繼續添加。NSNotificationCenter添加?

那麼有沒有辦法檢查通知是否存在之前獲得添加解決這個問題?

下面是我在我的viewDidLoad

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

而且我的dealloc:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

謝謝!
庫爾頓

編輯1:

我告訴我的一個UINavigationController的意見和它們之間進行切換。這裏是我的代碼刷新不同的看法:

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

你是如何加載和顯示你的觀點? – magma 2011-04-18 00:29:05

+0

@magma:請看我編輯的帖子。 – iosfreak 2011-04-18 00:33:19

+0

請將代碼發佈到實際創建並顯示視圖的地方。我感覺到奇怪的設置,但沒有實際的代碼就很難理解。 – magma 2011-04-18 00:47:00

回答

2

每次你調用addObserver,通知中心將添加一個條目到其內部結構。這意味着每次調用viewDidLoad時,通知中心都會再次呼叫觀察者。

如果您的視圖因任何原因被卸載,然後重新加載,那麼viewDidLoad將再次被調用。直到對象被銷燬,您的removeobserver纔會被調用,這可能解釋了爲什麼您的removeobserver不起作用。

您應該檢查您是否已經使用標誌調用addObserver,或者在卸載viewDidUnload方法中的視圖時手動使用removeObserver刪除觀察者。

編輯1:或者,您可以添加觀察員在其他地方,如在應用程序委託?

+0

我已經嘗試過,沒有任何工作。我試圖在我的viewWillUnload中調用它,它可以工作,但我不能再次調用它。 – iosfreak 2011-04-18 00:56:56

+0

你是什麼意思'不能再次調用它'? – futureelite7 2011-04-18 00:58:55

+0

如果我把'[[NSNotificationCenter defaultCenter] removeObserver:self];'在我的viewWillUnload中,它將工作,並且只有在切換視圖後才被調用一次。但是,我永遠無法打電話給我的通知去做我已經設定的任何事情。下面是我如何調用它:'[[NSNotificationCenter defaultCenter] postNotificationName:@「reloadBadge」object:self];'。謝謝,庫爾頓! – iosfreak 2011-04-18 01:02:22

0

當內存變得緊張時,操作系統會轉儲您的視圖,但會首先調用viewDidUnload;當它必須重新加載時,它會調用viewDidLoad。但是,只有當您的視圖的所有引用都已發佈時纔會調用,而這些引用在您的應用程序退出之前可能不會發生。

因此,正如@ futureelite7指出的那樣,每當您重新加載視圖時,您都會添加一個新的觀察者,但實際上從未刪除它。

您只需確保在viewDidLoad中添加了觀察者並在viewDidUnload中刪除了該觀察者,那麼您將不會遇到多重通知問題。不需要標誌或將觀察者放在其他地方。

從您的評論聽起來你可能已經嘗試過,但我建議通過你的代碼,並確定你只是將它們添加到DidLoad中,並且總是在DidUnload中刪除它們。它在應用程序之後就像app中的魅力一樣。


編輯補充

因爲你的觀點不斷得到卸載,這隻有當你做手工,如果對它的所有引用都將丟失,或者如果內存變得緊,我建議看情況所有這三點都有助於確保你在盡你所能地保持你的觀點。

+0

我必須能夠隨時致電以更新此視圖。但是如果觀察者被移除,它將不起作用。 – iosfreak 2011-04-18 03:05:46

+0

你的問題不是觀察者被移除 - 當我描述的正確使用時你有一個觀察者並且沒有重複 - 這是你的視圖被不方便地卸載。我在回答結尾處提出了幾件事:你檢查了他們中的任何一件嗎? – 2011-04-18 03:24:07

+0

我試圖把它放在我的viewWillAppear中,而不是我的viewDidLoad,它不會被添加,當我嘗試調用通知時沒有任何反應。我也刪除它在我的viewDidUnload,它不會將其刪除。每當我再次加載它時,我遇到同樣的問題。請注意我正在使用UINavigation控制器。謝謝。 – iosfreak 2011-04-18 03:30:22

相關問題