4

NSOperation/NSOprationQueue を使い始めたばかりなので、この質問をお許しください。:P

アプリの開始時に、いくつかの機能セットをキューで実行して、1 つが終了すると別の機能が開始されるようにします (一度にsetMaxConcurrentOperationCount1 つの操作のみが発生するように 1 に設定しました)。情報のサーバーへの一種のダウンロード/アップロードであるため、すべてがバックグラウンドで行われる必要があります。

最初の操作をキューに入れ、別のメソッドを呼び出します。このメソッドは、いくつかの新しいスレッドを呼び出して他のアクションを実行する可能性があります。

私の質問は、操作キューは、最初の操作で開始されたすべてのメソッド/スレッドが完了するのを待ってから、2 番目の操作を開始しますか?

4

3 に答える 3

1

NSOperationには、並行と非並行の2 種類があります。

非同時操作は-mainメソッドに実装され、このメソッドが戻ると、操作は完了したと見なされます。内部-mainでスレッドを生成し、スレッドが完了するまで操作を実行したい場合は、スレッドが完了するまで実行をブロックする必要があります-main(たとえば、セマフォを使用)。

-isExecuting並行操作にはやのような一連の述語があり、操作を開始-isFinishedする-startメソッドがあります。このメソッドは、いくつかのバックグラウンド処理を生成してすぐに戻る場合があります。そうするまで、操作全体が終了したとは見なされません-isFinished

GCD ができたので、ブロックとディスパッチ キューを の軽量な代替手段として検討することをお勧めします。 の方法NSOperationも参照してください。–addOperationWithBlock:NSOperationQueue

于 2013-02-21T07:46:27.967 に答える
0

NSOperationが[NSURLConnectionsendAsynchronousRequest:.....]のような非同期タスクを実行している場合、操作が実行されているスレッドは応答を待機せず、待機しません。mainメソッドの最後のステートメントまたはブロックの最後のステートメントが実行されるとすぐに、操作がキューから削除され、次の操作が開始されます。

于 2013-02-21T08:48:25.310 に答える
0

このようなものを使用できます

NSOperationQueue *queue=[NSOperationQueue new];
[queue setMaxConcurrentOperationCount:1];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
    //operation first
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
    //operation second
}];
[blockOperation2 addDependency:blockOperation1];
[queue addOperation:blockOperation1];
[queue addOperation:blockOperation2];
于 2014-08-30T06:22:29.150 に答える