2

我在 iPhone 应用程序中使用了一个名为 libmosquitto 的库。

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

我想获取它接收到的数据,并将其显示在 UITableView 中,但是(我认为)我必须编写 libmosquitto 用作 C 函数而不是 Objective C 方法的回调,因此我无法访问“self”以执行: [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);

}

谢谢

4

3 回答 3

3

查看 Grand Central Dispatch(GCD,又名 libdispatch)。它是一个 C 库,因此应该可以毫无问题地从您的 C 代码中调用。你想做这样的事情:

dispatch_async(dispatch_get_main_queue(), ^{
    //code you want on the main thread.
});
于 2011-11-04T14:18:08.630 回答
1

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

您还可以使用使用大中央调度和功能

dispatch_async(dispatch_get_main_queue(), ^{
    //some code
})
于 2011-11-04T14:26:19.133 回答
1

该函数mosquitto_newvoid *指针作为第二个参数,然后它将传递给您拥有的任何回调。您可以使用它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];
}
于 2011-11-04T14:32:38.497 回答