いつでもキャンセルできるようにしたい一連の NSOperations (最大同時実行数を 1 に設定) を実行しているメイン スレッドに NSOperationQueue があります。ボタンを押すと、すべての操作をキャンセルして終了するまで待つようにキューに指示します。これにより、操作キューが空になるまでメインスレッドがハングするはずですが、メインスレッドが無期限にハングします。
これを停止するために使用するコードは次のとおりです。
...
[myQueue cancelAllOperations];
[myQueue waitUntilAllOperationsAreFinished];
return YES; // This line never gets called
注:waitUntilAllOperationsAreFinished
以降のプロセスではキューを空にする必要があるため、使用する必要があります。
奇妙なことに、これはデバイス上でのみ発生しています。シミュレーターで実行すると、期待どおりに動作します。
ブレークポイントを監視しており、現在実行中の操作が完了するまで追跡できます。[self isCancelled] を検出し、実行中の処理を停止して、main
メソッドの最後までスキップします。操作でハングする原因が何もないことがわかります。すべての操作をキャンセルすると、他の操作は開始されず、キューは終了するはずです。ブレークポイントを追加して確認しましたが、他の操作は開始されません。
なぜこうなった?