Как добавить метод обратного вызова в прослушиватель событий 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
указатель или что-то?
документация не перечисляет 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()
в какой-то момент.
Других решений пока нет …