1

私のアプリケーションでは、ダウンロードした XML フィードを解析するために互いに呼び出すメソッドはほとんどありません。バックグラウンドですべての解析を行う必要がありNSOperationNSOperationQueue今のところメイン スレッドで実行され、アプリ全体がフリーズしています。

私のアプリのロジックは次のようなものです:

-(IBAction) callSync{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:APIURL]];

    AFURLConnectionOperation *operation = [[AFURLConnectionOperation alloc] initWithRequest:request];
    operation.completionBlock = ^{
          //1
          [self startParsing:operation.responseString];
    };
    [operation start];
}

//2
-(void)startParsing:(NSString*)str
{
         //some logic
         [self traverseXML:str];//Call traverseXML
}
//3
- (void) traverseXML:(TBXMLElement *)element {
        //Some logic
        [self saveFile:localWS];//CallsaveFile
}
//4
-(void) saveFile : (WorkFile *)_workFile{
        //Some logic
}

私の質問は次のとおりです。NSOperation各メソッドのクラスをサブクラス化する必要がstartParsingありtraverseXMLます。NSOperationまたは、1 つのサブクラスを作成し、内部ですべての実装メソッドを実行するだけで十分です。

4

4 に答える 4

1

いくつかの考え:

  1. NSOperationサブクラス化を行う必要はありません。本当にしたい場合はできますが、この状況ではまったく不要に思えます。たとえば、解析プロセス用に別の操作キューがある場合は、それを実行addOperationWithBlockまたは作成NSBlockOperationして解析キューに追加するだけで、はるかに簡単になります。例えば:

    [self.parseQueue addOperationWithBlock:^{
        [self startParsing:operation.responseString]; // this will call traverseXML and saveFile, so if those are all synchronous, then all three are within this one block
    }];
    

    個人的には、サブクラス化という余分な作業を行うのNSOperationは、独自のカスタム キャンセル ロジックを実装する必要があるときか、それ自体が非同期のタスクを含む操作を作成するときだけです。操作セットisFinished. NSOperationまたは、操作自体が非常に複雑なレベルに達したときにサブクラス化し、それを別の操作クラスに抽象化することでコードの読みやすさを向上させます。NSOperationしかし、これまでに説明したことは、サブクラス化を行う必要があることを示唆していません。NSBlockOperationまた、 orを使用するだけの方が、addOperationWithBlockをサブクラス化するよりもはるかに簡単ですNSOperation

  2. そこで、「サブクラス化」の問題はさておき、NSOperation3 つのメソッドに個別の操作が必要かどうかに移りましょう。これら 3 つのタスクを順番に実行していることを考えると、最初は 1 つの操作の候補のように思えます。必要に応じて、3 つの個別の操作を作成することもできますが、そのような追加レベルの複雑さに対する説得力のあるビジネス ケースは見当たりません。

  3. 私の考えでは、より興味深い質問は「どの操作キューを作成するか」です。そのためには、同時実行性が必要かどうか (たとえば、ネットワーク操作で非常に役立つ) と、その程度 (たとえば、同時ネットワーク要求をあまり多く発行しない方がよい、つまり、最大 4 つまたは 5 つにしておくのがよい) が問題になります。これは、複数の XML ファイルをダウンロードして解析する場合にのみ問題になります。そのシナリオでは、ネットワーク操作用に 1 つのキューがあり、解析操作用に別のキューがあると想像できます。そうすれば、ある程度の同時実行性を享受できるようにネットワーク キューを構成できますが、maxConcurrentOperationCountそのため、同時ネットワーク リクエストが多すぎません。解析/保存操作には、異なる同時実行機能がある場合があります (たとえば、別のパーサー オブジェクトをインスタンス化していない場合、解析は同時実行をまったくサポートしていない可能性があります)。多くの場合、同時実行によるパフォーマンスの向上と、そのような同時実行に必要なメモリ消費およびプログラムの複雑さとのバランスを取ることに行き着きます。

于 2013-06-25T05:45:06.670 に答える
0

NSOperationあなたがしたい3つの操作は実際には単独で生きていないので、私は1つを使います。

セーブだけは別クラスにすればいいのかもしれませんが、同じ操作でやっても問題ないと思います。

于 2013-06-25T03:17:19.480 に答える
0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    //parse
    //traverse
    //save

    dispatch_async (dispatch_get_main_queue (), ^{

        //update UI
    });
});
于 2013-06-25T03:19:51.563 に答える