1

我需要您幫助NSNotificationCenter。我有一個名爲Sensor的班級和一個名爲SensorManager的班級。我想從Sensor發送通知到SensorManager。在SensorManager我寫這樣的代碼:在NSOperationQueue內發佈通知

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

而且,很顯然,我有這樣的功能:

- (void) receiveTestNotification:(NSNotification *) notification 
{     
    if ([[notification name] isEqualToString:@"TestNotification"]) 
     NSLog (@"Successfully received the test notification!"); 
} 

傳感器類我有開始傳感器功能:

-(void)workSensor{    
     self.motionManager.accelerometerUpdateInterval = 0.05; 

     NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
     [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *data, NSError *error) {     
      [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; 

      NSLog(@"Udapte iphone acc data!"); 
     }]; 
    } 

} 

遺憾的是,SensorManager未收到通知。奇怪的(從我的角度看)是,如果我謹通知代碼NSOperationQueue塊之外,所有的偉大工程(見下面的代碼):

-(void)workSensor{  
      //now the notification is here. Outside the block. 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; 

      self.motionManager.accelerometerUpdateInterval = 0.05; 

      NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
      [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *data, NSError *error) {     


       NSLog(@"Udapte iphone acc data!"); 
      }]; 
     } 

    } 

我怎樣才能把通知發件人NSOperationQueue內塊?謝謝!

+0

當應用運行時,您是否看到「Udapte iphone acc data」消息?即這個處理程序是否被調用?此外,您是否在發佈問題時編輯了通知密鑰?也就是說,是否有可能在實際的代碼中輸入了通知名稱? (順便說一句,你可以通過不使用單獨的字符串文字來避免這個問題,而是在發佈時以及處理通知時都引用一個全局常量。) – Rob

+0

是的,我可以看到「更新iphone acc數據」不,不幸的是,通知的名稱沒有錯誤...謝謝你幫助我! – superpuccio

+0

np。底線,從操作隊列發佈通知沒有問題,所以它必須是別的東西。如果您仍然遇到問題,請從頭開始創建[MCVE](http://stackoverflow.com/help/mcve),這是一些能夠重現您所描述問題的最小示例。我無法重現您的問題(提示您的代碼中存在其他問題),但是如果您給我們提供可驗證的示例,那麼我們可以幫助您進一步提供幫助。 – Rob

回答

0

通知應該在主線程上發佈,所以你應該到這樣的事情:

[self performSelectorOnMainThread:@selector(sendNotification) withObject:nil waitUntilDone:YES]; 

,它將調用在主線程功能。然後定義通知發送功能:

- (void)sendNotification { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 
} 
+0

不,通知不必從主線程發佈,儘管這樣做通常很有用。順便說一句,在另一次討論中,OP堅持認爲他試圖將通知發佈到主線程,並沒有解決他的問題。底線,我不相信從主線程發佈通知解決了OP的問題。另外,如果我們想在主線程上做這個通知,使用GCD更容易做到這一點(例如'dispatch_async(dispatch_get_main_queue(),^ {...});')。 – Rob