从线程中的C函数更新UI

我正在iPhone应用程序中使用名为libmosquitto的库。

该库是用C语言编写的。它接收推送通知,因此在一个线程中运行。

我想把它接收到的数据,并显示在一个UITableView,但是(我认为)我必须编写libmosquitto作为C函数,而不是Objective C方法使用的callback,所以我不能访问“自我”为了做:[self performSelectorOnMainThread:@selector(hideActivityViewer)withObject:nil waitUntilDone:NO];

任何人都有这样的问题,有另一种方式我可以更新用户界面?

从我的一个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); } 

谢谢

函数mosquitto_new需要一个void *指针作为第二个参数,然后它将传递给你所有的callback函数。 你可以使用它来传递self作为应该到达你的callback的东西void *obj 。 然后将它转换为正确的[指向类]types是明确安全的,因为C允许任何指针types被转换为void * (和返回)而没有任何副作用。

那么你会做一些事情:

 void my_message_callback(void *obj, struct mosquitto_message *message) { [(ClassType *)obj performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO]; } 

看看Grand Central Dispatch(GCD,又名libdispatch)。 这是一个C库,所以应该可以从你的C代码中调用,而不会出现问题。 你会想要做这样的事情:

 dispatch_async(dispatch_get_main_queue(), ^{ //code you want on the main thread. }); 

你可以从任何地方访问NSApp,我相信任何NSApplication不能理解的消息都会被发送到你的实例NSApplicationDelegate的delagate。 如果不这样做,可以添加一个类应用程序,该应用程序返回可以运行你的方法的对象,如果这个对象是唯一的。

您也可以使用使用中央调度和function

 dispatch_async(dispatch_get_main_queue(), ^{ //some code })