Простой указатель на функцию обратного вызова C как часть протокола делегирования iPhone? - PullRequest
0 голосов
/ 30 ноября 2009

Попытка интегрировать простой код C / C ++ в проект iPhone как внешнюю статическую библиотеку. Пока все хорошо, но теперь я застрял в точке, где мне нужно зарегистрировать обратные вызовы библиотеки . Библиотека должна уведомлять мое приложение iPhone, когда что-то происходит. Похоже, хорошее место для определения делегата .

... но библиотека ожидает указатели на C-функции для обратных вызовов. Как определить их в Objective-C , как использовать их как часть шаблона делегата?

Извините, действительно не могу дать пример кода. Вот что-то похожее: сначала интерфейс, который я должен использовать для регистрации, затем определения обратных вызовов.

registerCallBack(&aCBack, &bCBack, &cCBack, &dCBack, &eCBack);

typedef void (aCBack)(uint32_t magic);
typedef void (bCBack)(const NewData* newData);
typedef void (cCBack)(uint32_t value, const std::vector<DataStuff*>* stuff);
typedef void (dCBack)(uint32_t value, const SomeData* data, const std::string text, uint32_t type);
typedef void (eCBack)(uint32_t value, const MoreData* more);

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

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

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

2 голосов
/ 30 ноября 2009

Для этого вы должны использовать обычные функции C, но вы можете вызывать их из объекта-делегата до тех пор, пока вы компилируете как Objective-C:

// need to have a reference to the object, of course
static DelegateClass* delegate = NULL;

// call at runtime with your actual delegate
void setCallbackDelegate ( DelegateClass* del ) { delegate = del; }

void callbackA ( uint32_t magic )
{
    [delegate handleCallbackA:magic];
}

// and so on...

[Обновление: как указывает gf, вы можете использовать метод класса и избежать необходимости в setCallbackDelegate.]

...