цель c — вызов метода C ++ с обратным вызовом из ObjectiveC

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

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

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

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

Я разработчик Swift, поэтому немного застрял на ObjectiveC … Большое спасибо

2

Решение

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

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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]