如何使用Delphi的NSNotificationCenter观察者?

时间:2018-07-03 11:16:27

标签: macos delphi firemonkey

有人使用过来自Delphi的Mac API中的NSNotificationCenter类吗?
我需要它添加一个观察者,当计算机从睡眠中(或进入睡眠状态)醒来时,该观察者将在MacOS上通知我的应用程序。为此,有方法addObserver注册了某个事件要调用的方法。就我而言,事件为NSWorkspaceDidWakeNotification

Swift中的代码类似于:

func OnWake(notif: NSNotification) {
    // Do something ...
}
.....    
NSWorkspace.shared().notificationCenter.addObserver(
   self, selector: #selector(OnWake(notif:)),
   name: Notification.Name.NSWorkspaceDidWake, object: nil)

我不确定如何在Delphi 10.1中翻译以上内容。 Macapi.Foundation中的方法声明为

procedure addObserver(notificationObserver: Pointer; selector: SEL; name: Pointer; &object: Pointer); cdecl;

从Apple文档看来,最后一个参数可以为nil,但是我不知道如何传递观察者指针,选择器和名称。

我做了几次尝试,如下所示,但是没有成功。我得到了AV或没有错误,但是也没有收到通知。
将通知名称作为NSString传递会导致AV,因此显然还需要其他内容。
我想知道Self指针在这里是否有任何含义,因为它是一个TObject,而我可能必须实现ILocalObject并使用GetObjectID来获取ObjectiveC对象指针。

procedure TSomeClass.onWake(aNote: NSNotification); cdecl;
begin
  // Do something
end;
.....
// Inside another TSomeClass method
NSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace).notificationCenter.
  addObserver(Self, (@onWake), StrToNSStr('NSWorkspaceDidWake'), nil);

那么,有没有人知道如何在Delphi中实现addObserver?
谢谢。

0 个答案:

没有答案