How to add an observer to NSNotificationCenter in a C++ class using Objective-C++?

前端 未结 3 1953
一整个雨季
一整个雨季 2021-01-05 08:08

I have a C++ class that I recently renamed from *.cpp to *.mm to support objective-c. So I can add the following objective-c code.

[[NSNotificationCenter defa         


        
相关标签:
3条回答
  • 2021-01-05 08:45

    Or you could also just use blocks and do:

    [
        [NSNotificationCenter defaultCenter] addObserverForName: @"notify"
        object: nil
        queue: nil
        usingBlock: ^ (NSNotification * note) {
            // do stuff here, like calling a C++ method
        }
    ];
    
    0 讨论(0)
  • 2021-01-05 08:50

    You'd need an Objective-C class to handle Objective-C notifications. Core Foundation to the rescue!

    In.. wherever you start listening for notifications, e.g. your constructor:

    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
        );
    }
    

    When done, e.g. in your destructor:

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

    And finally, a static function to handle the dispatch:

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

    Ta da!

    0 讨论(0)
  • 2021-01-05 09:00

    You can't add a C++ method as an observer because of how Objective-C method handles method invocation vs C++. You must have an Objective-C class (Declared with @interface Class .. @end) to respond to those methods.

    Your only option is to wrap your C++ class in an Objective-C class, or just have a very light wrapper that just has a reference to an object and calls a method statically once the notification arrives.

    0 讨论(0)
提交回复
热议问题