2013-06-27 25 views
2

我正在開發具有與外部附件通信的應用程序。該應用程序有幾個請求發送到外部附件。通知中心 - Obervers不能正常工作

我的問題:

我使用觀察者在不同的地方(類),我添加了以下觀察員viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(observer1:) 
    name:EADSessionDataReceivedNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(observer2:) 
    name:EADSessionDataReceivedNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(observer3:) 
    name:EADSessionDataReceivedNotification object:nil]; 

首屆觀察員的作品非常好,但我與其他兩個人有問題。直到第一個使用完畢,他們纔會迴應。我需要添加其他東西嗎?

的流程如下:

  1. 發送到EXT-ACC的要求和消防標誌知道哪些觀察者將返回的數據

  2. EXT-ACC與數據

  3. 響應
  4. 接收方法將通知推送到通知中心。

  5. 在1旗幟將採取數據的觀察員(在這一點上,我需要刪除的通知,因爲沒有人會需要它嗎?)。

+1

你想達到什麼目的?如果你爲相同的通知註冊3個觀察者,那麼每個事件都將被調用(按順序)。 –

+0

對不起,好像觀察者不醒目的通知,但observer1開頭 –

+0

如果我需要移動「的addObserver」到viewWillAppear中 –

回答

2

看起來你對NSNotificationCenter的工作原理有誤解。你是註冊你的對象(self),以EADSessionDataReceivedNotification三次,每次看到該通知與它自己的選擇(observer1observer2observer3)。

所以,作爲書面正在發生的事情是你的碼是否正確。當發佈EADSessionDataReceivedNotification時,NSNotificationCenter將指定的選擇器發送給每個觀察者。沒有條件邏輯或方法來取消通知。

鑑於你的描述,這聽起來像你只能一次觀察的通知和檢查你的標誌,以確定如何處理。例如:

// observe notificaton 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReceived:) object:nil]; 

// notification handler 
- (void)dataReceived:(NSNotification *)notification { 
    if (someCondition) { 
     [self handleDataCondition1]; 
    } 
    else if (aSecondCondition) { 
     [self handleDataCondition2]; 
    } 
    else if (aThirdCondition) { 
     [self handleDataCondition3]; 
    } 
    else { 
     // ???? 
    } 
} 
+0

好吧,我不知道,因此另外一個問題就是,我需要做的事情像進入觀察者後「刪除」通知?或者它由應用程序自動處理? –

+0

您必須在dealloc中調用removeObserver,因爲您要在viewDidLoad中添加觀察者。如果您將添加觀察者代碼移至其中一個viewXAppear方法,則應該在其中一個viewXDisappear方法中取消訂閱。 – Lance

+0

感謝您的幫助XJones :) –