将回调从C++转发到 ObjC



我正在使用.mm(ObjC ++(在ObjC iOS项目中嵌入C++引擎。

// consumer.m
Wrapper* wrapper = ...;
[wrapper setupWithTarget: self
                selector: @selector(gotData:)];
-(void) gotData: (int) k {...}
//wrapper.mm
@interface Wrapper() { id targ; SEL sel; } @end
:
-(void) setupWithTarget: T
               selector: S] {
    targ = T;
    sel = S;
    cppEngine = new cppEngine(); // i.e. C++ code
    cppEngine.addCallback(
        [](int data) {
            std::cout << "got" << data;
            [targ sel: data];
        }
    );
}

即,我们设置cppEngine给它一个回调;这里是一个C++lambda。

当引擎触发回调时,我们必须将数据传递回消费者。

我的问题是:这样做的正确架构是什么? 我不认为[targ sel: data];是有效的目标C。即使是这样,我也不确定SEL是否会通过lambda的捕获。它甚至是一个有效的C++对象吗?

我可以看到一种通过在wrapper.mm中蹦蹦跳跳的静态方法来实现的方法:

cppEngine.addCallback(
    [](int data) {
        [CppEngine myStaticMethod: data];
    }
);

。但这开始看起来很恶心。

您可以通过以下方式在目标上执行选择器:

[targ performSelector:sel withObject:data];

最新更新