2

私の理解では、 の長時間実行タスクはNSOperationその関数に実装する必要があり、が に追加されるとmainトリガーされます。NSOperationNSOperationQueue

これは、私NSOperationが複数の主要なタスクを持っている今まではうまくいきました。

最初のタスクは、ドキュメントを解析することです (ドキュメントを開くときに 1 回だけ適用する必要があります)。

2 番目のタスクはNSData、ドキュメントに追加することです (開いているドキュメントに対して複数回呼び出すことができます)。

私が考えることができる唯一の解決策は、両方のタスクをmain関数に移動し、実行時に実行するタスクを決定することです。

- (void)main
{
    @autoreleasepool
    {
        if(firstTaskTsDone)
        {
            [self doSecondTask];
        }
        else
        {    
            [self doFirstTask];
            firstTaskTsDone = YES;
        }
    }
}

しかし、これを達成するためのより良い方法があるに違いないと思いますか?

また、同時操作を使用して同じ結果を得るにはどうすればよいですか?

4

1 に答える 1

1

NSOperation2 番目のタスク用に 2番目を作成する必要があります。以下を使用できます。

[secondOperation addDependency:firstOperation];

2回目の作業開始を1回目の作業終了に依存させる。次に、これらの両方の操作を に追加できますNSOperationQueue。2 番目の操作では、そのdependenciesプロパティを使用して最初の操作にアクセスし、2 番目の操作がタスクを完了するために必要なデータを抽出できます。

別の方法NSOperationQueueとして、 をシリアル キューに設定することもできます。

[operationQueue setMaxConcurrentOperationCount:1];

その場合、依存関係を設定する必要はなく、1 番目と 2 番目を追加するNSOperation順序によって実行順序が決まります。

同時操作を使用して同じ結果を得るにはどうすればよいですか?

NSOperationQueue主な目的は、NSOperations非並行タスクを並行させることです。コードにある種の並行タスクがまだ含まれていない場合は、並行を使用する理由はありませんNSOperation

並行タスクの一般的な例はNSURLConnectionリクエストです。これは通常、コンカレントにラップされるため、リクエストの結果を処理するために他のプロセスがキューに追加される長いプロセスの一部としてNSOperation追加できます。NSOperationQueueNSOperations

メソッドが戻ると、通常NSOperationは終了します。非同期でmain開始した場合、接続が終了する直前に戻ります。同時操作として構成することにより、接続が実際に終了したときに に通知する責任があります。NSURLConnectionmainNSOperationQueue

于 2013-02-21T13:23:13.250 に答える