6

常に新しいスレッドでタスクを実行するため、 when runs fromNSOperationQueueの役割について混乱しています。isConcurrentNSOperationNSOperationQueue

の 2 つのサブクラスがありNSOperation、両方とも非同期プロセスを実行している場合、両方が から起動され、両方で 、、およびNSOperationQueueをオーバーライドします。一方を常にオーバーライドし、もう一方を常にオーバーライドすると、どのような違いがありますか。isCancelledisExecutingisFinishedisReadyisConcurrentreturn YESreturn NO

誰が実際に電話しisConcurrentますか? NOまたはの場合のロジックの変更方法YES

4

3 に答える 3

5

これはレガシーな方法で、OS X v10.6 および iOS 4 より前、つまりNSOperationQueueディスパッチ用の GCD が導入される前に使用されていました。

ドキュメントから

通常、オペレーション キューは、オペレーションの実行に使用されるスレッドを提供します。OS X v10.6 以降では、オペレーション キューはlibdispatchライブラリ (グランド セントラル ディスパッチとも呼ばれます) を使用してオペレーションの実行を開始します。その結果、同時操作または非同時操作として指定されているかどうかに関係なく、操作は常に別のスレッドで実行されます。ただし、OS X v10.5 では、isConcurrentメソッドが を返すNO場合にのみ、操作は別のスレッドで実行されます。そのメソッドが YES を返す場合、操作オブジェクトは独自のスレッドを作成する (または何らかの非同期操作を開始する) ことが期待されます。キューはスレッドを提供しません。

OS X >= 10.6 または iOS >= 4 を実行している場合は、安全に無視できます。

この事実の確認として、のドキュメントからisConcurrent

OS X v10.6 以降では、操作キューはこのメソッドによって返された値を無視し、常に別のスレッドで操作を開始します。

于 2013-08-21T11:28:54.500 に答える
0

元の質問を次のように言い換えます。

正しく構築された並行処理が与えられた場合、NSOperationによって返される値はisConcurrent実際に操作の実行をまったく変更しますか?

、 、またはオペレーティング システムの他の部分でisConcurrentフラグがどのように使用されているかを理解しようとすることはできますが、発見した情報に頼るのは間違いです。NSOperationNSOperationQueue

フラグの目的は、次のように説明されています。

操作が現在のスレッドに対して非同期で実行される場合は YES を返し、操作を開始したスレッドで操作が同期的に実行される場合は NO を返します。

正しく応答する限り、誰がメソッドを呼び出すか、またはメソッドが Apple フレームワーク内のロジックにどのように影響するかは重要ではありません。


その他の注意事項:

ドキュメントは、NSOperationQueueOSX 10.6 および iOS 4.0 の前後でこの値を使用する方法の変更について言及しています。

OS X v10.6 では、操作キューは isConcurrent によって返された値を無視し、常に別のスレッドから操作の start メソッドを呼び出します。ただし、OS X v10.5 では、操作キューは isConcurrent が NO を返す場合にのみスレッドを作成します。...

この変更により、QA1712で説明されている問題が発生しました。

この解説は、一般的にisConcurrentフラグが 10.6 および iOS 4 以降では使用されていないことを意味すると解釈され、無視してかまいません。メソッドは正式に廃止されておらず、並行操作に必要なオーバーライドとしてまだ文書化されているため、この解釈には同意しません。

また、過去に用途が変更されたという事実は、将来また変更される可能性があることを示しているため、現在は影響がないと思われる場合でも、正しく対応する必要があります。

于 2013-08-22T11:40:04.710 に答える