iPhone用にプログラミングするときNSOperation
に使用するよりも、使用するのに適したタスクはどれですか?GCD
私には、彼らは同じことをしているように見えます。どちらか一方の長所と短所がわかりません。
iPhone用にプログラミングするときNSOperation
に使用するよりも、使用するのに適したタスクはどれですか?GCD
私には、彼らは同じことをしているように見えます。どちらか一方の長所と短所がわかりません。
NSOperation
はGCDの上に構築されているためNSOperation
、ブロックを使用するか、GCDに直接渡すかが問題になります。
AnNSOperation
はかさばり、設定するためにより多くのボイラープレートコードが必要ですが、より多くの機能があります。NSOperation
コードのさまざまな部分に同じサブクラスを作成し、それらをキューに入れて実行することができます。
たとえば、ブロックをGCDに渡すのdispatch_async
は、すばやく簡単です。通常、ブロックを他の場所で再利用することはありません。コードのその時点でのみ実行されるブロックを設定し、それをGCDまたは他のAPIに渡して、すぐに続行します。
つまり、それぞれにメリットがあります。
どうやら、NSOperationQueueはiOS4の時点でGCD上に構築されています。ドキュメントは更新されていません。https://devforums.apple.com/message/352770(アカウントを作成する必要がある場合があります)したがって、Mike Abdullahのアドバイスに従い、手元のタスクに最も単純なAPIを使用する必要があります。dispatch_asyncは低レベルで、通常はCタイプのもの(ただしこれに限定されません)であり、ワンショットおよびシーケンシャルタイプの取引に適しています(このキューでこのブロックを起動します、FTW)。NSOperationQueuesは、より高レベルのObjective-Cのものであり、コードのさまざまなポイントで多くの操作を追加する場合や、同時実行性、優先度、依存関係を管理する必要がある場合に適しています。少なくともそれが私がそれらを使う方法です。
このような質問ではいつものように、利用可能な最も単純なAPIを使用してください。パフォーマンスの問題かどうかを測定し、必要に応じて再評価します。
ここで言及されているとは思わないことの1つは、NSOperation
実行中にsをキャンセルできるのに対し、実行が開始されるとブロックが完了することが保証されていることです。そうは言っても、GCDキューを一時停止(dispatch_suspend()
)して、現在実行中のブロックに続くブロックは実行されないようにすることができます。