私が欲しいもの
アプリケーションに NSOperationQueue があり、アプリケーションが終了する前にすべての操作が処理されることが重要です。終了する前に NSOperationQueue が空であることを確認するために、終了時に次のコードを取得しました。
if ([NSThread isMainThread]) {
while ([[operationQueue operations] count] > 0) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];
}
} else {
[operationQueue waitUntilAllOperationsAreFinished];
}
終了する前に NSOperation が「フリーズ」し、キュー全体がブロックされる前に、コードで問題が発生しました。明らかに、このような状況では、私のコードは例外をスローする必要があり、現在は例外をスローしています。
しかし、操作が停止してキューをブロックし、アプリケーションが終了せず、障害が検出されないという奇妙な事態が発生するのを防ぐ必要があります。
私のごみの解決策
操作を終了するキューにタイムアウトを設定することを検討しています。その後、タイムアウトしたときに例外をスローして、問題をキャッチできます。
しかし、これは正しくありません。理想的には、作業が完了したことを確認するためにタイマーに依存したくありません。
私の質問
操作が停止していないことを確認する、フェイル セーフな方法はありますか?