2011-09-29 9 views
0

私はプログラマーには見えないところにクラッシュするプログラムがあります。メモリ管理と関係するかもしれませんが、複数のスレッドや200人以上の通知オブザーバと関係があります。NSOperation to all runs結果

この種のNSOperationオブジェクトの派生が、すべての操作結果的に1つのスレッド上で通常の実行として実行されていますか?

[operation start]; 
[operation waitUntilFinished]; 
+0

私は賛同する同僚に、再度投票する前にhttp://stackoverflow.com/privileges/vote-downを見てもらいたいと思います。 – mbpro

答えて

3

いいえ、操作を開始し、完了するまで呼び出しスレッドをブロックします。

+0

基本的に、すべての操作がこのようにメインスレッドから開始された場合、結果的に実行が実質的に保証されます。動物園はそれに同意するだろうか? – mbpro

+2

技術的には、はい。しかし、あなたは非常に悪い主なスレッドをブロックします!あなたは 'NSOperationQueue'を作成し、' operationQueue.maxConcurrentOperationCount = 1'を設定して、操作をキューに追加したいと思うでしょう。また、iOS4 +用に開発している場合は、グランドセントラルディスパッチ(Grand Central Dispatch)に目を通してください。多くの場合、人生が楽になります。 – hypercrypt

+0

@hypercryptより正確には、それを呼び出すスレッドをブロックします。メインスレッドからこの構造体を使用すると、それは悪いことです。しかし、バックグラウンド・キューから別のキューに操作を送信することはまれではありません(例えば、共有リソースへのアクセスを同期させる別のシリアル・キューへ)。この場合、この構成は問題ありません。 – Rob

4

あなたが探しているのはoperationQueue.maxConcurrentOperationCount = 1だと思って、すべての操作をNSOperationQueueに追加してください。彼らは次々と逐次実行されます。

+0

したがって、私が正しく理解するならば、NSOperationQueueは、すべての操作のために1つの追加のスレッドだけが作成され、それらが次々と実行されることを保証します。 opが失敗したり、キャッチされない例外が発生したり、制御不能になったりすると、何が起こるか考えてみましょう。待ち行列全体の実行が停止するか、待ち行列が次の操作を開始するだけでしょうか? – mbpro

+0

@nmpro:はい、追加のスレッドは1つだけ作成されます。例外がスローされた場合にどうなるかはわかりません。キューは例外を食べて、続行するか、または排除する可能性があります。見つけ出すためにテストするのは簡単でしょう。操作がハングすると、キューがハングします。 – Icydog