简体   繁体   中英

AFJSONRequestOperation - interrupt operation queue in case of failure

I want to execute a series of AFJSONRequestOperation in order, and be able to interrupt the queue when one fails.

At the moment, the way I do it is not reliable, as sometimes the next operation will get a chance to start.

I have a singleton to call my api endpoint

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

And then I add the operations this way

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 ...

Trouble is, sometimes the operation following the one that fails still gets a chance to start.

So it seems that that having 1 concurrent operation max and a dependency chain isn't enough to tell the queue to wait until after the failure callback is fully executed.

What's the proper way to do this ?

Thanks

The failure callback is executed on the main thread and the operation (which is running on a background thread) doesn't wait for it. So, you'd need to do some editing to prevent the next operation from starting before the operation and its completion blocks have completed.

Or, instead of putting all the operations into the queue at the start, hold the list of operations in an array and just add the next operation following each success.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM