これは、他のスレッドでのブロッキングジョブをキャンセルするのに最適な方法に関連する、はるかに一般的な質問である可能性がありますが、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?
}