質問

この質問にはすでに答えがあります:

どのタスクが使用に適しているか 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())、現在実行中のブロックに続くブロックが実行されないように。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top