iPhoneのプログラミング時にGCD
を使用するのではなく、NSOperation
を使用する方が適切なタスクはありますか?GCDよりもNSOperationに適しているタスクはどれですか?
私には同じことをしているようです。自分が持っている強みと弱みを見ることはできません。
iPhoneのプログラミング時にGCD
を使用するのではなく、NSOperation
を使用する方が適切なタスクはありますか?GCDよりもNSOperationに適しているタスクはどれですか?
私には同じことをしているようです。自分が持っている強みと弱みを見ることはできません。
NSOperation
はGCDの上に構築されているので、NSOperation
を使用するか、ブロックをGCDに直接渡すかについての質問があります。
NSOperation
は、かさばっていて、設定するためにボイラープレートコードが必要ですが、機能性は非常に高くなっています。コードのさまざまな部分に同じNSOperation
サブクラスを作成し、それらをキューに入れて実行することができます。
たとえばGCDにブロックを渡す。 dispatch_async
はすばやく使い捨てです。通常はブロックを他の場所に再利用しません。コードのその時点でのみ実行されるブロックを設定し、それをGCDまたは他のAPIに渡してすぐに実行します。
それぞれにメリットがあります。
明らかに、NSOperationQueueはiOS 4の時点でGCD上に構築されています。ドキュメントは更新されていません。アップルの従業員がhttps://devforums.apple.com/message/352770に投稿していることを確認してください(アカウントを作成する必要があるかもしれません)ので、Mike Abdullahのアドバイスに従い、最も簡単なAPIを使用してください。 dispatch_asyncは、通常はCタイプのものですが、これに限定されない下位レベルであり、ワンショットおよびシーケンシャルタイプの取引に適しています(このブロックのFTWでこのブロックを起動します)。 NSOperationQueuesはより高いレベルのObjective-Cであり、コード内のさまざまな箇所で多くの操作を追加したり、並行性、優先度、依存性を管理する必要がある場合に適しています。少なくとも私はそれをどのように使うのですか。
私はまだこれが事実であると確信していません。この回答から2年以上が経過していますが、私は 'NSOperations'ドキュメントでこれを確認しています:'操作キューは、直接、セカンダリスレッドで実行するか、**間接的にlibdispatchライブラリ(グランドセントラルディスパッチ)。 – memmons
@Answerbot iOS 4とOS X 10.6では、もはやそうではありません。 「概要」セクションの最後の2つの部分を読んでください。http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004592 – iwasrobbed
私が信じていないことは、NSOperation
が実行中にキャンセルできることですが、ブロックは実行が開始されると完了することが保証されています。 GCDキューを中断することができます(dispatch_suspend()
)。そのため、現在実行中のブロックに続くブロックは実行されません。
nsoperationは、ファイルをダウンロードするなどの時間的に重要でない操作に適しており、gcdはオーディオのdspを実行するなどのクリティカルな操作に適していますか?あなたは、もう一方を使うときの例を私に教えてください。 – dubbeat
私はそうは思わない。 'NSOperation'は間違いなくオーバーヘッドが若干増えますが、それはGCDをタイムクリティカルな操作には適していません。ここでも、(メインキュー内の) 'NSOperation'はGCD上の薄い層です。だからあなたの質問は意味をなさない。どちらも* GCDです。 – Yuji
これは、上記のように、プログラムのさまざまな部分で同じバックグラウンドタスクを作成して実行すると、「NSOperation」を作成します。タスクがプログラムの一部からしか実行されていない場合は、 'dispatch_async'を使用します。 – Yuji