Node js原生模块,从objective-c块事件监听器触发回调不成功

问题描述 投票:1回答:1

我需要创建一个本地节点模块,它可以监听一个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)

任何帮助都将是非常感激的!

c++ node.js cocoa v8 objective-c++
1个回答
0
投票

尝试改变 event_callbackLocal<Function>Persistent<Function>.

寿命 Local 是联系在一起的。HandleScope 中创建的。一旦 HandleScope 出了范围(在你的例子中,在函数 setUpCallback),所有在它活动时创建的Locals都会失效。如果你需要的句柄是 持续 之后 HandleScope 消失了,你需要使用 Persistent. 更多细节在这里。https:/v8.devdocsembed#advanced-guide。.

© www.soinside.com 2019 - 2024. All rights reserved.