我需要创建一个本地节点模块,它可以监听一个objective-c OSX事件,并在每次事件发生时触发一个回调到javascript。
nativeAddon.listen(() => {
console.log('It works!')
})
回调的工作原理是,当立即调用 setUpCallback
函数,但它并没有从 objective-c 观察器块中发射。
下面是我的main.mm文件的样子
using namespace v8;
Local<Function> event_callback;
void setUpCallback(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
HandleScope scope(isolate);
// Store the callback to be used in the runCallback function
Local<Function> cb = Local<Function>::Cast(args[0]);
event_callback = cb;
// THIS WORKS
runCallback();
// Listen to a mac event and trigger the callback when it happens
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserverForName:NSWorkspaceActiveSpaceDidChangeNotification object:NULL queue:NULL usingBlock:^(NSNotification *note) {
// THIS DOESN'T WORK
runCallback();
}];
}
void runCallback() {
auto isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Local<Context> context = isolate->GetCurrentContext();
Local<Value> argv[1] = { String::NewFromUtf8(isolate, "hello world", NewStringType::kNormal).ToLocalChecked() };
auto fn = Local<Function>::New(isolate, event_callback);
fn->Call(context, Null(isolate), 1, argv).ToLocalChecked();
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "listen", setUpCallback);
}
NODE_MODULE(addon, Initialize)
任何帮助都将是非常感激的!
尝试改变 event_callback
从 Local<Function>
到 Persistent<Function>
.
寿命 Local
是联系在一起的。HandleScope
中创建的。一旦 HandleScope
出了范围(在你的例子中,在函数 setUpCallback
),所有在它活动时创建的Locals都会失效。如果你需要的句柄是 持续 之后 HandleScope
消失了,你需要使用 Persistent
. 更多细节在这里。https:/v8.devdocsembed#advanced-guide。.