29

iPhone用にプログラミングするときNSOperationに使用するよりも、使用するのに適したタスクはどれですか?GCD

私には、彼らは同じことをしているように見えます。どちらか一方の長所と短所がわかりません。

4

4 に答える 4

25

NSOperationはGCDの上に構築されているためNSOperation、ブロックを使用するか、GCDに直接渡すかが問題になります。

AnNSOperationはかさばり、設定するためにより多くのボイラープレートコードが必要ですが、より多くの機能があります。NSOperationコードのさまざまな部分に同じサブクラスを作成し、それらをキューに入れて実行することができます。

たとえば、ブロックをGCDに渡すのdispatch_asyncは、すばやく簡単です。通常、ブロックを他の場所で再利用することはありません。コードのその時点でのみ実行されるブロックを設定し、それをGCDまたは他のAPIに渡して、すぐに続行します。

つまり、それぞれにメリットがあります。

于 2010-12-03T11:10:58.103 に答える
13

どうやら、NSOperationQueueはiOS4の時点でGCD上に構築されています。ドキュメントは更新されていません。https://devforums.apple.com/message/352770(アカウントを作成する必要がある場合があります)したがって、Mike Abdullahのアドバイスに従い、手元のタスクに最も単純なAPIを使用する必要があります。dispatch_asyncは低レベルで、通常はCタイプのもの(ただしこれに限定されません)であり、ワンショットおよびシーケンシャルタイプの取引に適しています(このキューでこのブロックを起動します、FTW)。NSOperationQueuesは、より高レベルのObjective-Cのものであり、コードのさまざまなポイントで多くの操作を追加する場合や、同時実行性、優先度、依存関係を管理する必要がある場合に適しています。少なくともそれが私がそれらを使う方法です。

于 2011-08-06T21:42:46.030 に答える
8

このような質問ではいつものように、利用可能な最も単純なAPIを使用してください。パフォーマンスの問題かどうかを測定し、必要に応じて再評価します。

于 2010-12-03T16:52:38.620 に答える
3

ここで言及されているとは思わないことの1つは、NSOperation実行中にsをキャンセルできるのに対し、実行が開始されるとブロックが完了することが保証されていることです。そうは言っても、GCDキューを一時停止(dispatch_suspend())して、現在実行中のブロックに続くブロックは実行されないようにすることができます。

于 2011-11-23T15:12:12.603 に答える