2016-03-10 7 views
0

Вот код, который я пытаюсь использовать Objective C method в C callaback. В результате он сбой:Вызов C обратного вызова в Objective C

typedef void (^BlockCallback)(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); 

- (void)startProcessing:(BlockCallback)progressCallback 
{ 
    pcap_loop(handle, packetsNumber, (__bridge void *)progressCallback, NULL);// it crashes here 
} 
.... 

[self startProcessing:^(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { 
/// some processing code here 
}]; 

ответ

1

Я не вижу, как C может вызвать такой блок. Это должно работать, хотя, при условии, что первый указатель (user) является определенный пользователем контекст, который можно использовать для передачи self функции обратного вызова:

static void _pcapCallback(u_char *user, const struct pcap_pkthdr *header, const u_char *packet) 
{ 
    MyClass *myClass = (MyClass *)user; 
    [myClass _pcapHeader:header packet:packet]; 
} 

@implementation MyClass 

- (void)_pcapHeader:(const struct pcap_pkthdr *)header 
      packet:(const u_char *)packet 
{ 
    // do thing 
} 

- (void)startProcessing 
{ 
    pcap_loop(handle, packetsNumber, _pcapCallback, self); 
} 

... 

@end