#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. 🙁 Я боялся, что ответ будет примерно таким. Спасибо за ответ