I have a process with 3 steps. Each one needs to be completed before the other (synchronous, serial, etc.). All of them need to be done in background so as not to block the UI.

I'm trying to rearchitect things a bit to use 2 queues, one for network ops, one for db updates to protect core data. Bouncing back and forth between the queues, i can keep things serial, just firing off a block and then having that call something when it's done.

I'm using addOperationWithBlock to create the operation and enqueue it, but dont see the obvious way to do a completion block (like i do with setCompletionBlock for example). I'm not sure how to start step 2 when that's done. Am i overthinking it and i just call the next method (the starting point for step 2) at the end of the block for step 1? Problem is things inside those blocks may be async like AFNetworking calls.

here's some code and more info. I want to hit the server, grab the data, then on completion perform something else, but link them so it must go from data to verification step serially:

```
self.networkQueue = [NSOperationQueue new];
self.networkQueue.maxConcurrentOperationCount = 1;
self.databaseQueue = [NSOperationQueue new];
self.databaseQueue.maxConcurrentOperationCount = 1;

[self.networkQueue addOperationWithBlock:^{

        NSString *listURL = [NSString stringWithFormat:GET_LIST,BASE_URL];
        NSURL *url = [NSURL URLWithString:briefListURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request
                                                                                            success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                                                                                self.list = [NSArray arrayWithArray:(NSArray *)JSON];                                                                                                    
                                                                                            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                                                                [self listOperationDidFail];
                                                                                            }];

        // define block that will execute when the task is finished
        [operation setCompletionBlock:^{
            // Latest data retrieved. Check if db needs updating
            [self verifyList];
        }];

        [operation start];
    }];

```