2017-01-23 7 views
2

Мне нужно вызвать метод C++ и передать в обратного вызова метода в качестве параметра ... от метода ObjectiveC ... Этого метода обратного вызова будет затем запускаемыми несколько раз в ObjectiveC. .., как это обратный вызов ... и так, то мне нужно поймать, что метод обратного вызова ObjectiveC назад, как это будет называться как закрытие от Swift код ...Вызова методы C++ с обратным вызовом из ObjectiveC

Это метод C++ подпись

static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0); 

Мой вопрос - то, что должно быть синтаксисом блока этого метода обратного вызова, объявленного i п ObjectiveC (в .mm и .h), который затем может быть передан в качестве параметра этого someCallback в C++

Я Swift разработчик так бит застрял на ObjectiveC ... Большое спасибо

ответ

2

Вы не можете передайте блок Objective-C (или быстрое закрытие) в качестве аргумента указателя функции. Вам нужно будет создать отдельную автономную функцию и передать ее в качестве обратного вызова.

void MyCallback(unsigned int value) 
{ 
    // ...do something... 
} 

И в основной код:

cPlusPlusMethodWithCallBack("something", MyCallback); 

Теперь, недостатком является то, что в вашей функции обратного вызова, вам часто необходимо ссылаться на конкретный объект Objective-C для того, чтобы правильно обрабатывать обратный вызов. Если вам требуется именно этот обратный вызов, вам нужно сохранить его где-то как статическую переменную, чтобы можно было получить доступ к функции MyCallback.

С другой стороны, если у вас есть контроль над cPlusPlusMethodWithCallBack исходным кодом, вы можете обновить его принять параметр void * «ссылки», а затем поставить этот параметр в качестве аргумента при вызове функции обратного вызова:

static void cPlusPlusMethodWithCallback(void (*callback)(void *ref), void *ref) 
{ 
    // ...really time consuming processing... 
    callback(ref); 
} 

Затем обновите функцию обратного вызова:

void MyCallback(void *ref) 
{ 
    ObjectiveCObject *obj = (ObjectiveCObject *)ref; 
    [obj doSomething]; 
} 

И когда вы сначала вызвать метод, просто передать в объекте, который нужен в качестве опорного параметра:

cPlusPlusMethodWithCallback(MyCallback, myObjectiveCObject);