1

一連の AFJSONRequestOperation を順番に実行し、失敗したときにキューを中断できるようにしたい。

現時点では、次の操作が開始される可能性があるため、私のやり方は信頼できません。

APIエンドポイントを呼び出すシングルトンがあります

AFJSONRequestOperation *lastOperation; // Used to add dependency
NSMutableArray *operations = [NSMutableArray array]; // Operations stack
AFAPIClient *httpClient = [AFAPIClient sharedClient];
[[httpClient operationQueue] setMaxConcurrentOperationCount:1]; // One by one

そして、この方法で操作を追加します

NSMutableURLRequest *request = ...; // define request

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    // Takes care of success

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    [[httpClient operationQueue] setSuspended:YES];
    [[httpClient operationQueue] cancelAllOperations];
}];

[push:operation addDependency:lastOperation];
[operations $push:operation]; // This is using ConciseKit
lastOperation = operation;

// Repeat with other operations

// Enqueue a batch of operations
[httpClient enqueueBatchOfHTTPRequestOperations:operations ...

問題は、失敗した操作に続く操作がまだ開始される可能性があることです。

そのため、最大 1 つの同時操作と依存関係チェーンを持つだけでは、障害コールバックが完全に実行されるまで待機するようにキューに指示するには不十分なようです。

これを行う適切な方法は何ですか?

ありがとう

4

1 に答える 1

1

失敗のコールバックはメイン スレッドで実行され、操作 (バックグラウンド スレッドで実行されている) はそれを待ちません。そのため、操作とその完了ブロックが完了する前に次の操作が開始されないように、編集を行う必要があります。

または、開始時にすべての操作をキューに入れる代わりに、操作のリストを配列に保持し、成功するたびに次の操作を追加します。

于 2013-06-16T09:28:44.060 に答える