2

ビューの負荷でインターネットからのデータの取得を実行しようとしています。UI が遅れないように、HTML のダウンロードと解析を実行しています。

[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];

オンラインでアラートがあるかどうかを確認します。ただし、ビューに情報を表示するために、iOS はメイン スレッドを使用する必要があると言います。だから私は直後に表示コードを呼び出します:

[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];
[self loadAlert];

これを行うと、 は[self loadAlert];実際にはバックグラウンドでセレクターの前に実行されます (より高速です)。このため、バックグラウンドのセレクターが提供するはずの情報がありません。

それが確実に実行されるようにするにはどうすればよい[self loadAlert];ですか? または、これを行うより良い方法はありますか?

4

2 に答える 2

5

loadAlert呼び出しをalertThreadMethodに移動するか、GrandCentralDispatchシリアルキューを使用できます

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    [self loadAlert];
});
dispatch_release(queue);

または、loadAlertがUIを更新している場合、メインキューでUIの更新を行うため、次のようになります。

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadAlert];
    });
});
dispatch_release(queue);

ちなみに、独自のシリアルキューを作成するのではなく、この1つのタスクをバックグラウンドで実行している場合は、既存のバックグラウンドキューの1つを使用することもできます。キューを作成する必要があるのは、シリアルの性質が必要な場合のみです(つまり、dispatch_async呼び出しが多数発生し、それらを同時に実行することはできません)。しかし、この単純なケースでは、シリアルキューの作成と解放をバイパスすることで、これはさらに少し効率的になる可能性があります。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadAlert];
    });
});
于 2012-06-21T22:02:53.017 に答える
1

alertThreadMethod で、情報を取得したら、メソッド performSelectorOnMainThread:withObject:waitUntilDone: を呼び出し、セレクターを loadAlert メソッドに渡します。

-(void)alertThreadMethod
{
   // get your information here

   performSelectorOnMainThread:@selector(loadAlert) withObject:nil waitUntilDone:NO
}
于 2012-06-21T22:11:34.560 に答える