Метод обратного вызова для запуска цикла Apple

0

Как добавить метод обратного вызова к слушателю событий Apple, например:

CFRunLoopSourceRef IOPSNotificationCreateRunLoopSource(IOPowerSourceCallbackType callback,
                                                       void *context);

Как добавить метод или блок к следующему методу, чтобы при изменении источника питания я мог записывать что-то вроде ниже (я вижу, что это C++, но NSLog по-прежнему работает в Obj- C++):

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{

    CFRunLoopSourceRef IOPSNotificationCreateRunLoopSource(callbackMethod(),
                                                           void *context);
}
void callbackMethod(){
    //    NSLog("No power connected"); or NSLog("Power connected");
}

Думаю, мне нужно изменить:

IOPowerSourceCallbackType callback

на указатель или что-то еще?

Теги:
macos

1 ответ

0

В документации не IOPowerSourceCallbackType тип IOPowerSourceCallbackType, но он объявлен в <IOKit/ps/IOPowerSources.h> как:

typedef void  (*IOPowerSourceCallbackType)(void *context);

Это означает, что вы определили бы свой обратный вызов как:

void callback(void *context)
{
    // ...
}

Вы передадите это в IOPSNotificationCreateRunLoopSource используя следующий код:

CFRunLoopSourceRef rls = IOPSNotificationCreateRunLoopSource(callback, whateverValueIsMeaningfulToYourCallback);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);

Вы хотите тщательно рассмотреть, какой цикл цикла вы хотите запланировать источник и в каком режиме. Если вам нужно еще раз добавить материал источника цикла (rls) в последующие моменты времени, не отключайте его немедленно. Храните его в переменной экземпляра или что-то в этом роде и отпустите его, когда закончите с ним. В частности, в какой-то момент вам может потребоваться аннулировать его с помощью CFRunLoopSourceInvalidate().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню