0

インターフェイス関数の多くを呼び出すスレッドがあります.それが呼び出されると、GUIアクションを実行する必要があります.GUIをメインスレッドで実行する必要があることを認識しているため、今でも使用していました

            dispatch_async(dispatch_get_main_queue(), ^{
                // Some method call...
            });

ほとんどの場合は問題なく動作しますが、まだここで問題に直面しています..たとえば..私のインターフェース関数は以下のようなものです...

        void interface_fun(char *name, int user_id) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    gui_acton_with_name(name, user_id);
                });
         }

現在、名前ポインターはほとんどの場合、ディスパッチ呼び出し内で nil を取得しています (ここでデータを失っていると思います)。 performselectoronMainthread メソッドで試しました..

どんなアイデアでもありがとう..

4

2 に答える 2

1

問題は、interface_fun戻った後、が指すオブジェクトのname割り当てが解除されていることである可能性があります。

ローカル変数にコピーする必要がありますname。ローカル変数は、ブロックの最後で解放されます。(ARCを使用している場合は自動)。このようなもの:

NSData *data = [NSData dataWithBytes:name length:strlen(name)+1];
dispatch_async(dispatch_get_main_queue(), ^{
  gui_acton_with_name((char*)[data bytes], user_id);
});

ARCを使用している場合は、またはnameとして渡すこともできます。その場合、内容はブロックが終了するまで保持されます。NSString*NSData*

于 2013-01-16T11:14:37.750 に答える
1

これをコメントに入れるのは難しすぎるため、これを回答として投稿していますが、使用するperformSelectorOnMainThread:withObject:waitUntilDone:場合は、2ビットの情報を辞書(または配列)にラップできますが、情報にアクセスできるため、辞書の方がうまく機能します名前で):

NSDictionary *info = @{ @"name" : @(name), @"user_id", @(user_id) };
[self performSelectorOnMainThread:@selector(someMethod:) withObject:info waitUntilDone:NO];

そして、あなたの方法で( oldschool に戻らない限りiOS 6のみobjectForKey:):

- (void) someMethod:(NSDictionary *) info
{
    NSString *name = info[@"name"];
    NSNumber *user_id = info[@"user_id"];

    // unbox name and user_id if necessary
}
于 2013-01-16T11:12:43.487 に答える