Mono C# 'dan Obj-C'ye bazı Interop yapıyorum ve bu soruna rastladım. C# kodunun, bir işlev işaretçisiyle yaptığı bir geri bildirimi iletmesi gerekir. Obj-C tarafındaki fonksiyon göstergesini bulabilirim ve her şey işe yarıyor. Ancak şimdi bu işlev işaretçisini, geri çağrı olarak bloklarla çalışan üçüncü taraf API'sine geri arama olarak vermem gerekiyor. Üçüncü tarafın C# işlevini çağırmasını istiyorum - böylece bir şekilde ya işlev göstericisini bir bloğa dönüştürmeye çalışacağım, böylece üçüncü taraf bunu çalıştırabilir ya da bir çeşit köprü oluşturabilir - kendi bloğumu oluşturabilirim Bu işlev işaretçisini çalıştırır ve üçüncü tarafa verir. Bunu yapmanın bir yolunu bulmak mümkün görünmüyor - hangi işlevin çalıştırılacağı ve daha sonra üçüncü tarafa verileceği bilgileri içeren bir blok oluşturabilirim. Belki benim için başka bir seçenek var mı?Bir işlev işaretçisini nesnel C'deki bir bloğa dönüştürme "C
Düzenleme: İşlevi bir genel değişkende koymak işe yarayabilir, ancak üçüncü taraf API'sı senkronize olmayanlar gibi çok sayıda gruba sahip olmak istiyorum ve yanlış çağrıyı geri çağırmak istemiyorum.
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
Sonra
void RegisterCallback(char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
ile bu çalıştırmak Ve BAD_ACCESS başarısız:
Kod denedim. Belki de Obj-C ile yetkin olmadığım için yanlış bir şey yapıyorum. Doğrudan çalıştırılırsa ve bloğa çağrılırsa ancak işlev (sonuç) satırında başarısız olursa geri aramanın tamam olduğunu doğrulayabilirim.
Eh, haklısın. Bir sebepten dolayı bunu düşünmemiştim. Harika ve çok temiz çalışıyor. Teşekkür ederim! – Amitloaf