NSDistributedNotifications не распределяется между экземплярами одного и того же приложения - PullRequest
2 голосов
/ 04 февраля 2012

На 10.7.2 у меня проблемы с получением стандартных NSDistributedNotifications для работы из коробки.

Даже при возврате в (Полная версия XCode на https://github.com/dirkx/Example-NSDistribtuedNotification-Failing) к чему-то так простому, как показано ниже:

  1. Великолепно работающие уведомления «локально» (как в NSNotificationCenter), но
  2. Нет связи между приложениями, когда я запускаю приложение дважды (например, из командной строки)
  3. Нет уведомлений, когда другие приложения регистрируются для этого (или для nill)
  4. Нет и отладки / информации в журналах дистрибутированных демонов.

Чего мне не хватает?

 NSString * kSayNotification = @"org.webweaving.sayExample";

 // Send a Distributed Notification on button press.
 //
 -(IBAction)buttonChange:(NSButton *)sender {
    NSString * str = (sender.state == NSOnState) ? @"Yes" : @"No";
    [[NSDistributedNotificationCenter defaultCenter] 
            postNotificationName:kSayNotification 
                          object:str
     ];
 }

 // Update a label on receiving a Notification. 
 //
 -(void)notif:(NSNotification *)nf {
    .. snipped time string ...

    // Textfield with the time of arrival and the value passed in the notification.
    //
    textField.stringValue = [NSString stringWithFormat:@"%@: %@", 
                              dStr, (NSString *)nf.object
                            ];
 }

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
    // Register for the notifications.
    //
    [[NSDistributedNotificationCenter defaultCenter] 
        addObserver:self 
           selector:@selector(notif:) 
               name:kSayNotification
             object:nil];

 }

В качестве наблюдателя уведомлений (https://github.com/melo/notification-watcher) не показывает уведомления - но уведомления обрабатываются в приложении.

1 Ответ

0 голосов
/ 07 февраля 2012

Оказывается, что когда нет других причин для возврата CFRunLoop, сообщения помещаются в очередь на неопределенный срок.Это кажется умышленно.

Я нашел для этого три обходных пути - ни один из которых не очень хорош - оба они включают

  1. добавление deliverImmediately:YES к публикации,
  2. a deliverImmediately: с NSNotificationSuspensionBehaviorDeliverImmediately для наблюдателя или
  3. с установкой таймера для преднамеренного прерывания цикла выполнения каждые секунды.

Очевидно - все это не обходится дешево.

Дв

...