2012-02-13 273 views
2

我用我的視圖控制器此功能來識別該應用是否再度活躍,並刷新了一些數據:UIApplicationWillEnterForegroundNotification被調用越來越

[[NSNotificationCenter defaultCenter] 
      addObserver:self 
       selector:@selector(becomeActive:) 
        name:UIApplicationWillEnterForegroundNotification 
       object:nil]; 

這趨於活躍後適用於提神,但每次的應用程序從後臺返回前臺(不活動到活動),它會再次調用該功能。

所以,如果我關閉並打開應用程序4次,該函數將被調用4次!

編輯:該函數將被調用這種方式:

  1. 關閉和打開:函數調用2次
  2. :叫1次(也就是這樣,我想它)
  3. 關閉和打開功能
  4. 關閉和打開:調用的函數3次
  5. 關閉和打開:調用的函數4倍

但是在回到前臺後只需要調用1次。在某些情況下,應用程序必須在激活並檢查數據後顯示警報視圖。當該功能被調用4次時,該警報視圖將顯示4次。

在應用程序委託中,這個函數什麼都不做,但它被提及。

我正在使用Xcode 4.2和iOS 5!我也用UIApplicationDidBecomeActive,但它也會導致同樣的問題。

+0

問題是您不斷添加更多觀察者,並且每個實例在事件發生時都會引發一個調用。無論如何,只要在任何時候只啓用觀察者的一個實例。 – 2012-02-13 17:00:19

回答

0

這實際上是這個通知應該做的。如果您需要在應用程序啓動時收到通知,請使用applicationDidFinishLaunching。

+0

如果應用程序再次變爲活動狀態(或返回前臺狀態),則不會調用此函數。 – user1175122 2012-02-13 14:10:06

8

我不知道你何時將自己添加爲觀察者,但每次應用程序變爲活動狀態時,您似乎都會一次又一次地添加自己作爲觀察者。因此多次呼叫。

您只能將您的視圖控制器添加爲觀察者一次。嘗試使用控制器init:方法。並且,確保在dealloc:方法中將視圖控制器作爲觀察者移除。

+1

我不同意你的建議。如果你希望不同的對象被告知事件,那麼註冊'UIApplicationWillEnterForegroundNotification'是完全正確的。事實上,它可以做出更好的設計。不過,我同意你對這個問題的原因所做的假設。原始海報必須確保只將視圖控制器_once_添加到通知中心,而不是每次應用程序進入前臺或進入後臺時。 – 2012-02-13 14:28:16

+0

我真的很喜歡這種使用NSNotifactionCenter的方式,因爲我可以更新我想更新的viewcontroller。我不想將它添加到通知中心。什麼是放入nsnotification中心的最佳位置。其實它是在視圖控制器中,這可能是問題嗎?我應該把它放到一個自己的功能?也許是隻會被稱爲一次的東西?你有什麼建議嗎? – user1175122 2012-02-13 14:55:31

+0

我看到,使用這種方法很好,我做了一個錯誤的假設。您必須確保只調用一次[[NSNotificationCenter defaultCenter] addObserver:...]。所以,也許把這個調用放在你的控制器的viewDidLoad:方法中,並且當控制器被銷燬時(通過使用[[NSNotificationCenter defaultCenter] removeObserver:...] 100%確定你從defaultCentre中刪除了控制器。調用[[NSNotificationCenter defaultCenter] addObserver:...]? – 2012-02-13 16:30:08

0

不,我解決了我的問題。

通過觀察者調用的方法不再調用viewDidLoad了。因此viewDidLoad只會調用一次(在第一次應用程序啓動時)。

將通過觀察者調用的函數getActive現在調用首先從viewDidLoad中調用的方法。

我還將removeObserver函數放到viewDidLoad,如果用戶將完全停止該應用程序,將只會調用該函數。

感謝您的想法和幫助!現在我知道更多關於製作多任務應用程序的信息。

0

我想你應該在viewWillDisappear方法中刪除addObserver。它爲我工作。

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
}