1

これは、他のスレッドでのブロッキングジョブをキャンセルするのに最適な方法に関連する、はるかに一般的な質問である可能性がありますが、GrandCentralDispatchのコンテキストでの解決策に興味があります。ネットワークからデータを取得するまで基本的にブロックする関数を呼び出す必要があります。永久にブロックされる可能性があります。このブロックされた呼び出しがプライベートディスパッチキューで発生するように設定しました。データを取得したら、ブロックをメインキューに戻します。問題は、private-queue-blockとblockingの呼び出しをディスパッチすると、それを実際にキャンセルすることはできないということです。この機能がユーザー設定の切り替えに関連付けられていると想像してください。それらがオフに切り替わった場合、私はこのブロッキングジョブと実行ブロックを本質的にちょうど終了させたいと思います。このタイプの問題に対する良い解決策はありますか?

ありがとう

- (void)_beginListeningForNetworkJunk
{
    dispatch_async(my_private_queue, ^{
        // blocks until it gets data
        id data = [NetworkListener waitForData];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self _handleNetworkData:data];
        });
    });
}

- (void)_endListeningForNetworkJunk
{
   // How do I kill that job that is blocked on my private queue?
}
4

2 に答える 2

1

できません。問題はNetworkListener、そのブロッキングと中断のないインターフェイスにあります。

NSPort通常、ネットワーク接続を非同期的に処理するようにブロックをコーディングし、カスタム実行ループソース(またはパイプファイル記述子など)などの他のシグナリングメカニズムも監視します。ネットワーク接続にアクティビティがあった場合、それは処理されます。シグナリングメカニズムが起動すると、ネットワーク接続をシャットダウンしてブロックを終了します。

そのようにして、ブロックはその協力によってキャンセル可能になる可能性があります。

ブロックが詰まっているため、-waitForData連携できません。彼らの協力なしにブロックをキャンセルするメカニズムはありません。NSOperationとNSThreadについても同じことが言えます。その理由は、他のスレッドのアクティビティをその協力なしに終了することは基本的に実行不可能だからです。

ネットワークコードには別の設計が必要です。

于 2012-05-28T20:06:13.073 に答える
0

原則として、他のスレッドで実行されているものをキャンセルすることはできません。別のスレッドで実行されているタスクにキャンセルを丁寧に依頼することしかできません。私は通常、タスクを表すオブジェクトを作成して、これらのオブジェクトで「キャンセル」を呼び出せるようにします。

あなたの状況では:waitForDataをキャンセルすることはできません(NetworkListenerがそれを行うためのAPIを持っていない限り、その場合、waitForDataはデータの到着とキャンセルを区別するための何らかのメカニズムを必要とします)。

_endListenForNetworkJunkでは、BOOL値を「キャンセル」に設定して、呼び出しがキャンセルされたことを示すことができます。次に、メインキューで実行されるコードで、その「キャンセルされた」値がまだクリアされているかどうかを確認します。そうすれば、メインスレッドから_endListenForNetworkJunkを呼び出すと、_handleNetworkDataが呼び出されないことが確実になります。別のスレッドから_endListenForNetworkJunkを呼び出す場合、メインスレッドが_handleNetworkDataの呼び出しを開始した可能性があります。

メインキューにディスパッチする直前に「キャンセル」をチェックした場合、そのブロックはすでにディスパッチされている可能性がありますが、メインスレッドで_endListenForNetworkJunkを呼び出す直前には実行されていません。

于 2014-03-26T18:48:22.913 に答える