問題
- NSOperationQueueという名前があります
logEntryGeneratorQueue
- キューのすべての操作が完了するまで待ちたい
私が使用する場合:
[logEntryGeneratorQueue waitUntilAllOperationsAreFinished];
キューに追加するスレッドがバックグラウンド自体にある場合は、正常に機能します。
ただし、単体テストでこのコードを実行している場合は、メインスレッドで実行されます。それで私はこの「解決策」を思いつきました、それは私が本当に好きではありません:
if ([NSThread isMainThread]) {
while ([[logEntryGeneratorQueue operations] count] > 0) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
} else {
[logEntryGeneratorQueue waitUntilAllOperationsAreFinished];
}
これは常に理想的とは言えませんでしたが、10.5では常に正常に機能していました。ただし、プロジェクトを10.6 SDKを使用するようにアップグレードしたため、これが機能しなくなりました。
あるテストでは、テストが完了する前に実際にテストを終了しました。理由はわかりません。10.6ではNSOperationQueuesの動作が異なっていたのと関係があると思いますが、現在はGCDを使用しています。
私が試したこと
runUntilDateをsleepに置き換えてみました。これは、私が思ったように、すべてのテストがここに到達すると永久に一時停止することを意味します。
私の質問
NSOperationQueueがメインスレッドで終了するのを待つより良い方法はありますか?そうでない場合、どうすればこのコードを10.6で動作させることができますか?