2015-10-28 5 views
-1

Im, использующий SDK (Linphone), написанный на C, и мне нужно реализовать функцию обработчика изменения состояния вызова, объявленную в C-файле, в объектный C или лучший в среде Swift.Реализовать C Обратный вызов в Objective-C

Вот заявление в C:

// declaration 
void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg); 

// typedef 
typedef void (*LinphoneCoreCallStateChangedCb)(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message); 

Здесь структура, содержащая свойство для LinphoneCoreCallStateChangedCb, которая необходима для реализации

typedef struct _LinphoneCoreVTable{ 
    LinphoneCoreCallStateChangedCb call_state_changed;/**<Notifies call state changes*/ 
} LinphoneCoreVTable; 

Вот моя попытка:

_vTable->call_state_changed = ^(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message) 
{ 

} 

Вот ошибка: enter image description here

Каков правильный синтаксис для этого?

Спасибо!

+0

Вам не нужно реализовывать, потому что код C * просто * отлично работает в Objective-C? – kientux

+1

Не размещайте код как изображение. – dandan78

ответ

2

Вы пытаетесь использовать блок, когда все, что вам нужно, это (возможно static) C-функции, а именно:

static void _linphoneCallback(LinphoneCore *lc, LinphoneCall *call, 
           LinphoneCallState cstate, const char *message) 
{ 
    // do thing 
} 

... 
_vTable->call_state_changed = _linphoneCallback; 

Однако я не могу видеть, как вы бы пройти объективно- C экземпляр класса обратного вызова, что делает обратный вызов трудно использовать в любом языке, в том числе С.

+0

Я просто использую notificationcenter, все, что мне нужно, это значение cstate. Это возможно? – Hokage

+0

@Hokage Да, я бы так сказал. – trojanfoe

0

Определение обратного вызова, как этот typedef void (^LinphoneCoreCallStateChangedCb)(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message);

И U se it: LinphoneCoreCallStateChangedCb callback = ^(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message){};

+0

Обратный вызов не является блоком. – trojanfoe

+0

А вы правы. Я думал, что он хочет исправить синтаксис блока. – sahara108

Смежные вопросы