GCDよりもNSOPERATIONにより適したタスクはどれですか? [複製
-
30-09-2019 - |
質問
この質問にはすでに答えがあります:
どのタスクが使用に適しているか NSOperation
使用するのではなく GCD
iPhoneのプログラミングはいつですか?
私には、彼らは同じことをしているようです。一方が他の強みと弱点を見ることができません。
解決
NSOperation
GCDの上に構築されているので、質問はあなたが使用するかどうかについてのものです NSOperation
または、ブロックを直接GCDに渡します。
an NSOperation
かさばっていて、それをセットアップするためにより多くのボイラープレートコードが必要ですが、より多くの機能を備えています。同じものを作成できます NSOperation
コードのさまざまな部分にサブクラスを入れて、キューに入れて実行します。
たとえば、ブロックをGCDに渡す dispatch_async
迅速で使い捨てです。通常、ブロックを他の場所に再利用しません。コードのその時点でのみ実行されるブロックを設定し、GCDまたは他のAPIに渡して、すぐに進みます。
そのため、それぞれにメリットがあります。
他のヒント
どうやら、nsoperationQueueはiOS 4の時点でGCD上に構築されています。ドキュメントは更新されていません。ここでAppleの従業員によるこの投稿を確認してください: https://devforums.apple.com/message/352770 (アカウントを作成する必要がある場合があります)したがって、マイクアブドラのアドバイスに従い、手元のタスクに最も簡単なAPIを使用する必要があります。 Dispatch_asyncは低レベルで、通常はCタイプのもの(ただし、これらに限定されません)であり、ワンショットおよびシーケンシャルタイプの取引に適しています(このキューでこのブロックを発射します、FTW)。 nsoperationQueuesはより高いレベル、Objective-Cのものであり、コードのさまざまなポイントで多くの操作を追加し、および/または並行性、優先順位、依存関係を管理する必要がある場合に適しています。少なくともそれが私がそれらを使用する方法です。
そのような質問でいつものように、利用可能な最も単純なAPIを使用してください。パフォーマンスの問題であるかどうかを測定し、必要に応じて再評価します。
私がここで言及されていないと私が信じていないことの1つはそれです NSOperation
実行中にSをキャンセルできますが、実行が開始されるとブロックが完了することが保証されます。そうは言っても、GCDキューは中断できます(dispatch_suspend()
)、現在実行中のブロックに続くブロックが実行されないように。