3

NSOperationQueueを に追加してから、NSOperationこの操作を別の に追加しても安全NSOperationQueueですか?

これは、私がやろうとしていることを視覚化するためのコードです。

NSOperationQueue *mainQueue = [NSOperationQueue alloc] init];

// Here I declare some NSBlockOperation's, i.e. parseOperation1-2-3
// and also another operation called zipOperation, which includes
// an NSOperationQueue itself. This queue takes the processed (parsed) files
// and write them to a single zip file. Each operation's job is to write the data
// stream and add it to the zip file. After all operations are done,
// it closes the zip.

[zipOperation addDependency:parseOperation1];
[zipOperation addDependency:parseOperation2];
[zipOperation addDependency:parseOperation3];

[mainQueue addOperation:parseOperation1];
[mainQueue addOperation:parseOperation2];
[mainQueue addOperation:parseOperation3];
[mainQueue addOperation:zipOperation];
4

1 に答える 1

5

私はこのアプローチを使用し、App Store にデプロイされたライブ コードで実行しています。開発中、またはコードが公開されてから 2 か月間、問題は発生していません。

私の場合、高レベルの一連の操作があり、その一部には一連のサブ操作が含まれていました。各サブ操作の詳細を高レベルのコードに公開するのではなく、独自のサブ操作NSOperationsを含み、エンキューするものを作成しました。NSOperationQueues最終的に完成したコードは、はるかにクリーンで維持しやすいものでした。

私は広範囲に読んNSOperationで、このアプローチに対して警告するコメントを見たことがありません. オンラインで多くの情報、Apple のドキュメント、および WWDC ビデオを確認しました。

考えられる唯一の「欠点」は、Concurrent操作の理解と実装が複雑になることです。NSOperationQueueanに anを埋め込むというNSOperationことは、操作が になることを意味しますConcurrent

それは私からの「はい」です。


同時操作に関するその他の詳細:

Anは、通常 (非並行) でメソッドをNSOperationQueue呼び出し、呼び出しが戻るまでに操作が終了することを期待します。たとえば、指定したコードの一部は、ブロックの最後で完了します。startNSOperationstartNSBlockOperation

start呼び出しが戻るまでに作業が終了しない場合は、 を操作NSOperationとして設定します。これにより、 は、後で操作が終了したことを伝えるまで待機する必要があることを認識します。ConcurrentNSOperationQueue

たとえば、同時操作は、非同期ネットワーク呼び出しを実行するためによく使用されます。start メソッドはネットワーク呼び出しのみを開始し、その後バックグラウンドで実行され、終了時に操作を呼び出します。次に、 のisFinishedプロパティをNSOperation、作業が完了したことを示すフラグに変更します。

だから....通常、NSOperationQueueそのキューに操作を追加すると、それらの操作がバックグラウンドで実行されます。NSOperationQueueしたがって、 を の中に入れると、NSOperationその操作はバックグラウンドで行われます。したがって、操作はあり、内部がすべての操作の処理を終了concurrentしたときにフラグを立てる必要があります。NSOperationQueue

または、呼び出しが戻る前にすべての作業が完了していることを確認するために使用できるメソッドがいくつかありNSOperationQueueますが、これらにはスレッドのブロックが含まれており、私はそれらを避けました。そのアプローチの方が快適に感じるかもしれません。スレッドをブロックすることによる副作用があります。waitUntilAllOperationsAreFinishedstart

私の場合、私はすでに操作に精通していConcurrentたので、操作として設定するだけで簡単でしたConcurrent.

同時操作に関するドキュメント:

同時実行プログラミング ガイド: 同時実行のための操作の構成

この例では、バックグラウンドで作業を実行するためにスレッドを切り離していNSOperationQueueます。

于 2013-05-26T09:40:47.587 に答える