NSOperationQueue を使用して最初のマルチスレッド iPhone アプリを作成しています。これは、独自のスレッド ディスパッチを管理するよりもロードが優れており、潜在的に高速であると聞いたからです。
ボードを別々のピースに分割し、別々のスレッドで各ボードを計算してから、それらをつなぎ合わせることによって、ライフ ゲーム ボードの結果を計算しています。 . ボードごとに NSInvocationOperation オブジェクトを作成し、それらを OperationQueue に送信しています。ボードのすべてのパーツを送信したら、OperationQueue への waitUntilAllOperationsAreFinished 呼び出しですべての計算が完了するのを待ちます。
これは機能するはずのように見えますが、問題なく機能しますが、スレッドが非常にスローアウトされるため、マルチスレッド バージョンではシングル スレッド バージョンよりも計算に時間がかかります。ああ、いや!NSOperationQueue に送信された NSOperations の作成と終了を監視したところ、後で呼び出されるまでしばらくの間、Operation Queue do-diddly-daddlin に留まっているものがあることがわかりました。最初は、「キューが一度に処理できるスレッドの数は非常に多いかもしれない」と考えてから、キューの maxConcurrentOperationCount を任意の高い数値 (ボードピースの量をはるかに超える) に上げましたが、同じことを経験しました!
誰かが NSOperationQueue を「オーバードライブ」に追い込む方法を教えて、キューをできるだけ早くディスパッチするように言うことができるかどうか疑問に思っていました.それか、何が起こっているのか教えてください!