2010-12-03 8 views

答えて

24

NSOperationはGCDの上に構築されているので、NSOperationを使用するか、ブロックをGCDに直接渡すかについての質問があります。

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

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

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

+3

nsoperationは、ファイルをダウンロードするなどの時間的に重要でない操作に適しており、gcdはオーディオのdspを実行するなどのクリティカルな操作に適していますか?あなたは、もう一方を使うときの例を私に教えてください。 – dubbeat

+2

私はそうは思わない。 'NSOperation'は間違いなくオーバーヘッドが若干増えますが、それはGCDをタイムクリティカルな操作には適していません。ここでも、(メインキュー内の) 'NSOperation'はGCD上の薄い層です。だからあなたの質問は意味をなさない。どちらも* GCDです。 – Yuji

+4

これは、上記のように、プログラムのさまざまな部分で同じバックグラウンドタスクを作成して実行すると、「NSOperation」を作成します。タスクがプログラムの一部からしか実行されていない場合は、 'dispatch_async'を使用します。 – Yuji

8

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

+7

この回答は、のAPIが最も簡単です。 – Akku

+2

どちらがもっとも簡単なのですか? –

+0

基本的には、手近な作業を考慮しない場合は、どちらも簡単なAPIを知りた​​いと思います。しかし、標準的なユースケースを提供するには、メインスレッド上に持ちたくないバックグラウンドのタスクが1つあるとします。終了したらビューを変更する必要があります。 – Akku

12

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

+0

私はまだこれが事実であると確信していません。この回答から2年以上が経過していますが、私は 'NSOperations'ドキュメントでこれを確認しています:'操作キューは、直接、セカンダリスレッドで実行するか、**間接的にlibdispatchライブラリ(グランドセントラルディスパッチ)。 – memmons

+1

@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

3

私が信じていないことは、NSOperationが実行中にキャンセルできることですが、ブロックは実行が開始されると完了することが保証されています。 GCDキューを中断することができます(dispatch_suspend())。そのため、現在実行中のブロックに続くブロックは実行されません。

関連する問題