2

iPhone アプリで libmosquitto というライブラリを使用しています。

ライブラリは C で書かれています。プッシュ通知を受け取るため、スレッドで実行されます。

受信したデータを受け取り、それを UITableView に表示したいのですが (と思います) libmosquitto が Objective C メソッドではなく C 関数として使用するコールバックを作成する必要があるため、「self」にアクセスすることはできません。 : [self performSelectorOnMainThread:@selector(hideActivityViewer) withObject:nil waitUntilDone:NO];

このような問題を抱えている人はいますか? UI を更新する別の方法はありますか?

私のObjective Cメソッドの1つの内部から、これを呼び出します:

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

グランドセントラルディスパッチ(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

この関数は 2 番目の引数としてポインターをmosquitto_new取りvoid *、これを任意のコールバックに渡します。selfそれを使用して、コールバックに として到着する必要があるものとして渡すことができますvoid *objvoid *C では、副作用なしで任意のポインター型に変換 (および元に戻す) できるため、それを正しい [ポインターへの] クラス型にキャストすることは明示的に安全です。

したがって、次のようにします。

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 に答える