3

我想檢查我的視圖是否正在偵聽UIApplicationWillResignActiveNotification。如果正在偵聽,那麼我想在dealloc期間刪除它。現在我想知道是否有辦法使用目標c來做到這一點?有沒有辦法檢查觀察者是否在聽某些NSNotification?

我不想避免多次添加通知。這裏有更多的解釋我正在嘗試做什麼。

我有自定義gridView。我可以使用縮放啓用或縮放禁用來初始化它。如果啓用了擴展的啓用,我將自己添加爲UIApplicationWillResignActiveNotification的觀察者,但是如果其init的縮放禁用,那麼它不會將其自身添加爲該通知的觀察者。現在,在dealloc中,我想將該gridView作爲該通知的觀察者來移除。所以我想知道是否有辦法找出gridView是否正在偵聽通知。

+0

你能否指定你想完成什麼任務? – ivanmoskalev

+2

可能重複[如何避免添加多個NSNotification觀察員?](http://stackoverflow.com/questions/5658426/how-to-avoid-adding-multiple-nsnotification-observer) – iwasrobbed

+0

有沒有辦法檢查如果觀察員已經註冊。 – iwasrobbed

回答

0

如果你想檢查dealloc方法,如果你的視圖被註冊爲觀察者來正確地刪除它 - 你不應該。所有你需要做的是:

[[NSNotificationCenter defaultCenter] removeObserver:myView] 

,它會刪除觀察員您訂閱

+1

只是做[[NSNotificationCenter defaultCenter] removeObserver:myView]不是很好的編程習慣。 – slonkar

2

我不知道的任何方法來檢查什麼通知此觀測器監聽所有通知,但無論它監聽UIApplicationWillResignActiveNotification與否,美其名曰:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification]; 

會導致自我停止監聽該通知,或者什麼也不做,如果自己不聽它。

指定通知的名稱,要停止監聽是最好的做法,但因爲你說你把這個在dealloc中,它也將是安全的,只是這樣做:

[[NSNotificationCenter defaultCenter] removeObserver:someObserver]; 
0

NSNotificationCenter不支持此開箱即用。你與KVO有同樣的問題。

一般只是跟蹤是否使用布爾屬性註冊了對象,並且只有在設置了此布爾值時才註銷。

+0

'NSNotificationCenter'有點寬容,因爲你總是可以刪除一個觀察者,如果這個對象目前不是觀察者,它根本不會做任何事情。所以你總是可以通過'NSNotificationCenter'安全地調用'removeObserver:'。但是,如果您嘗試刪除KVO觀察者但目標未觀察到,則會發生異常。這意味着,您需要使用KVO跟蹤您的觀察狀態,但不一定使用'NSNotificationCenter'。 – DarkDust

+0

@DarkDust只是因爲你沒有*擁有*並不意味着你*應該*不這樣做。 –

相關問題