Robię trochę Interop z Mono C# do Obj-C i wpadłem na ten problem. Kod C# musi przekazać wywołanie zwrotne - które wykonuje za pomocą wskaźnika funkcji. Mogę uzyskać wskaźnik funkcji od strony Obj-C i zadzwonić i wszystko działa. Ale teraz muszę podać wskaźnik funkcji jako wywołanie zwrotne do API strony trzeciej, która działa z blokami jako wywołanie zwrotne. Chcę, aby strona trzecia zadzwoniła do funkcji C# - więc w pewien sposób próbuję przekonwertować wskaźnik funkcji na blok, aby strona trzecia mogła go uruchomić, lub utworzyć jakiś mostek - utwórz własny blok, który uruchamia wskaźnik funkcji i przekazuje go stronie trzeciej. Nie mogę znaleźć sposobu na zrobienie tego - w jaki sposób wygenerowałbym blok z informacją o tym, która funkcja ma zostać uruchomiona, a następnie przekazuje ją stronie trzeciej. Może jest inna opcja dla mnie?"Konwertowanie" wskaźnika funkcji na blok w celu-C
Edycja: Umieszczenie funkcji w zmiennej globalnej może działać, ale chcę mieć wiele takich funkcji, ponieważ interfejs API innej firmy jest asynchroniczny i nie chcę, aby wywoływał nieprawidłowe wywołanie zwrotne.
Kod Próbowałem:
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
I wtedy uruchomić to z
void RegisterCallback(char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
I to nie z BAD_ACCESS. Może robię coś złego, bo nie jestem jeszcze biegły w Obj-C. Mogę potwierdzić, że wywołanie zwrotne jest w porządku, jeśli uruchomione jest bezpośrednio i że blok jest wywoływany, ale zawiedzie w linii funkcji (wyniku).
Cóż, masz rację. Z jakiegoś powodu nie pomyślałem o tym. Działa świetnie i bardzo czysto. Dziękuję Ci! – Amitloaf