«Преобразование» указателя функции на блок в target-C
Я делаю Interop из Mono C # в Obj-C и столкнулся с этой проблемой. Код C # должен передать обратный вызов - что он делает с указателем на функцию. Я могу получить указатель на функцию со стороны Obj-C и вызвать его, и все работает. Но теперь мне нужно дать указатель на эту функцию в качестве обратного вызова для стороннего API, который работает с блоками в качестве обратного вызова. Я хочу, чтобы третье лицо вызывало функцию C # - таким образом, я пытаюсь либо преобразовать указатель функции в блок, чтобы третья сторона могла запустить его, либо создать какой-то мост - создать свой собственный блок, который выполняется указатель этой функции и передать его третьему лицу. Кажется, я не могу найти способ сделать это - как мне сгенерировать блок с информацией о том, какую функцию запустить, и затем передать ее третьему лицу. Может быть, есть другой вариант для меня?
Редактирование: помещение функции в глобальную переменную может работать, но я хочу иметь возможность иметь множество таких функций, поскольку сторонний API является асинхронным, и я не хочу, чтобы он вызывал неправильный обратный вызов.
Код, который я пробовал:
typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);
@interface FunctionToBlock : NSObject
{
DummyAction function;
DummyBlock block;
}
- (id) initWithFunction: (DummyAction) func;
- (DummyBlock) block;
@end
@implementation FunctionToBlock : NSObject
- (id) initWithFunction: (DummyAction) func {
if (self = [super init]) {
function = func;
block = ^(char * result) {
function(result);
};
}
return self;
}
- (DummyBlock) block {
return block;
}
@end
А потом я запускаю это с
void RegisterCallback( char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
И это не с BAD_ACCESS. Возможно, я делаю что-то не так, поскольку я еще не очень хорошо разбираюсь в Obj-C. Я могу подтвердить, что обратный вызов в порядке, если выполняется напрямую, и что вызывается блок, но он не работает в строке функции (результата).