обновление пользовательского интерфейса из функции C в потоке - PullRequest
2 голосов
/ 04 ноября 2011

Я использую библиотеку под названием libmosquitto в приложении для iPhone.

Библиотека написана на C. Она получает push-уведомления и поэтому работает в потоке.

Однако я хочу взять полученные данные и отобразить их в UITableView (я думаю,) Я должен написать обратные вызовы, которые libmosquitto использует как функции C, а не как методы Objective C, поэтому я не могу получить доступ к «self», чтобы сделать:

У кого-нибудь есть подобные проблемы, есть ли другой способ, которым я мог бы обновить интерфейс?

Внутри одного из моих методов Objective C я называю это:

mosquitto_message_callback_set(mosq, my_message_callback); 

Иmy_message_callback определяется как:

void my_message_callback(void *obj, struct mosquitto_message *message)
{
NSLog(@"Do this thing:");
if(message->payloadlen){
    const char *payload = (const char *)message->payload;
    [array addObject:[NSString stringWithUTF8String: payload]];
    //[self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO];        

    //printf("%s %s\n", message->topic, message->payload);
}else{
    //printf("%s (null)\n", message->topic);
}
//fflush(stdout);

}

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 ноября 2011

Посмотрите на Grand Central Dispatch (GCD, он же libdispatch).Это библиотека C, поэтому ее можно вызывать из кода C без проблем.Вы хотели бы сделать что-то вроде:

dispatch_async(dispatch_get_main_queue(), ^{
    //code you want on the main thread.
});
1 голос
/ 04 ноября 2011

Функция mosquitto_new принимает указатель void * в качестве второго аргумента, который затем передается любым вашим обратным вызовам. Вы можете использовать это, чтобы передать self как вещь, которая должна прийти к вашему обратному вызову как void *obj. Тогда явно безопасно привести его к правильному типу класса [pointer to], поскольку C позволяет преобразовывать любой тип указателя в void * (и обратно) без каких-либо побочных эффектов.

Итак, вы бы сделали что-то вроде:

void my_message_callback(void *obj, struct mosquitto_message *message)
{
    [(ClassType *)obj
        performSelectorOnMainThread:@selector(updateTable)
        withObject:nil
        waitUntilDone:NO];
}
1 голос
/ 04 ноября 2011

Вы можете получить доступ к NSApp отовсюду, и я считаю, что любое сообщение, не понятное NSApplication, будет отправлено на его delagate, который является вашим экземпляром NSApplicationDelegate.Если этого не происходит, вы можете добавить приложение класса, которое возвращает объект, который может запускать ваш метод, если этот объект уникален.

Вы также можете использовать команду Использовать большую центральную диспетчеризацию и функцию

* 1004.*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...