“Convertendo” um ponteiro de função em um bloco no objetivo-C
Eu estou fazendo alguma Interop de Mono C # para Obj-C e corri para este problema. O código C # precisa passar um retorno de chamada - o que ele faz com um ponteiro de função. Eu posso pegar o ponteiro de função do lado Obj-C e chamá-lo e tudo funciona. Mas agora preciso fornecer esse ponteiro de função como um retorno de chamada para a API de terceiros, que funciona com blocos como um retorno de chamada. Eu quero que o terceiro chame a função C # - então, de certa forma, eu estou tentando converter o ponteiro de função em um bloco para que o terceiro possa executá-lo, ou fazer algum tipo de ponte - criar meu próprio bloco que é executado esse ponteiro de função e dar para o terceiro. Eu não consigo encontrar uma maneira de fazer isso - como eu iria gerar um bloco com informações de qual função executar e, em seguida, dar a terceiros. Talvez haja outra opção para mim?
Edit: Colocar a função em uma variável global pode funcionar, mas eu quero ser capaz de ter uma infinidade deles, pois a API de terceiros é assíncrona e não quero que ela chame o retorno de chamada errado.
Código que eu tentei:
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
E então eu corro isso com
void RegisterCallback( char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
E isso falha com BAD_ACCESS. Talvez eu esteja fazendo algo errado, já que eu ainda não sou muito proficiente com o Obj-C. Posso confirmar que o retorno de chamada está ok se for executado diretamente e que o bloco está sendo chamado, mas falha na linha de função (resultado).