Переадресация обратного вызова из 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];