цель c — пересылка обратного вызова из 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];
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]