Переадресация обратного вызова из C++ в ObjC

Я встраиваю движок C++ в проект ObjC iOS, используя.mm (ObjC++).

// 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++ лямбда.

Когда механизм запускает обратный вызов, мы должны передать данные обратно потребителю.

Мой вопрос: какова правильная архитектура для этого? Я не думаю [targ sel: data]; Действительна Цель С. И даже если бы это было, я не уверен SEL собирается сделать это через захват лямбды. Это даже действительный объект C++?

Я могу видеть способ сделать это, батут от статического метода в wrapper.mm:

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

... но это начинает выглядеть неприлично.

1 ответ

Вы можете выполнить селектор на цели:

[targ performSelector:sel withObject:data];
Другие вопросы по тегам