Как добавить наблюдателя в NSNotificationCenter в классе C с использованием Objective-C ?

#iphone #objective-c #nsnotificationcenter

#iPhone #objective-c #nsnotificationcenter

Вопрос:

У меня есть класс C , который я недавно переименовал из *.cpp в *.mm для поддержки objective-c. Итак, я могу добавить следующий код objective-c.

 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(notificationHandler:) 
                                                 name:@"notify"
                                               object:nil];
  
  • Как я могу написать метод notificationHandler на c ?
  • Будет ли работать настройка addObserver:self свойство?

Ответ №1:

Или вы также могли бы просто использовать блоки и делать:

 [
    [NSNotificationCenter defaultCenter] addObserverForName: @"notify"
    object: nil
    queue: nil
    usingBlock: ^ (NSNotification * note) {
        // do stuff here, like calling a C   method
    }
];
  

Комментарии:

1. Это выглядит великолепно. Но как вы его удаляете?

2. developer.apple.com/documentation/foundation/… Довольно простой способ, взгляните.

Ответ №2:

Для обработки уведомлений Objective-C вам понадобится класс Objective-C. Core Foundation спешит на помощь!

В .. где бы вы ни начали прослушивать уведомления, например, в вашем конструкторе:

 static void notificationHandler(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo);

MyClass::MyClass() : {
    // do other setup ...

    CFNotificationCenterAddObserver
    (
        CFNotificationCenterGetLocalCenter(),
        this,
        amp;notificationHandler,
        CFSTR("notify"),
        NULL,
        CFNotificationSuspensionBehaviorDeliverImmediately
    );
}
  

По завершении, например, в вашем деструкторе:

 MyClass::~MyClass() {
    CFNotificationCenterRemoveEveryObserver
    (
        CFNotificationCenterGetLocalCenter(),
        this
    );
}
  

И, наконец, статическая функция для обработки отправки:

 static void notificationHandler(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    (static_cast<MyClass *>(observer))->reallyHandleTheNotification();
}
  

Та да!

Комментарии:

1. О, круто. Мне было интересно, о чем эта штука с core foundation. спасибо, приятель

2. впечатляет. будут ли эти функции CF * считаться «бесплатным мостом» к «обычному» NSNotificationCenter?

3. Нет, CFNotificationCenter это не бесплатный мост, соединенный с NSNotificationCenter . Таким образом, пользовательский экземпляр любого из них не будет использоваться в другом API. Однако, если вы используете стандартный центр в любом из них (например, CFNotificationCenterGetLocalCenter() или [NSNotificationCenter defaultCenter] ) и отправляете ему уведомление, уведомление отправляется обоим наборам слушателей (т. Е. Интерфейсы различны, но базовая система одна и та же).

Ответ №3:

Вы не можете добавить метод C в качестве наблюдателя из-за того, как метод Objective-C обрабатывает вызов метода в отличие от C . У вас должен быть класс Objective-C (объявленный с помощью @interface Class .. @end ), чтобы реагировать на эти методы.

Ваш единственный вариант — обернуть ваш класс C в класс Objective-C или просто иметь очень легкую оболочку, которая просто содержит ссылку на объект и статически вызывает метод после получения уведомления.

Комментарии:

1. 🙁 Я боялся, что ответ будет примерно таким. Спасибо за ответ