Как добавить наблюдателя в NSNotificationCenter в классе C ++, используя Objective-C ++? - PullRequest
4 голосов
/ 19 мая 2011

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

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

Ответы [ 3 ]

13 голосов
/ 19 мая 2011

Вам понадобится класс Objective-C для обработки уведомлений Objective-C. Основа для спасения!

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

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

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

    CFNotificationCenterAddObserver
    (
        CFNotificationCenterGetLocalCenter(),
        this,
        &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();
}

Та да!

11 голосов
/ 18 сентября 2014

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

[
    [NSNotificationCenter defaultCenter] addObserverForName: @"notify"
    object: nil
    queue: nil
    usingBlock: ^ (NSNotification * note) {
        // do stuff here, like calling a C++ method
    }
];
3 голосов
/ 19 мая 2011

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

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

...