Search code examples
iosobjective-cafnetworkingafnetworking-2afhttprequestoperation

AFHTTPRequestOperation dependency


I have the following scenario in an application that uses AFNetworking to make services calls:

  1. I call a special service that will generate a token for me
  2. I call the service that I want, sending this token as a parameter
  3. I call another special service to destroy the token.

I have to follow these 3 steps every time I make a request to the server. I cannot change the way the server works, so I have to comply to this requirement. I also cannot use the same token for more than one request.

My question is the following - I tried to accomplish this using AFHTTPRequestOperations:

NSError *serializationError = nil;
NSMutableURLRequest *request = [self.manager.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:@"serviceName.json" relativeToURL:self.manager.baseURL] absoluteString] parameters:@{ @"token": token } error:&serializationError];
AFHTTPRequestOperation *myRequestOperation = [self.manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    // Success login
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
    // Failure logic
}];

[myRequestOperation addDependency:createTokenRequestOperation];

where self.manager is an instance of AFHTTPRequestOperationManager, but there is a problem - I do not have a value for token.

Since myRequestOperation should execute only after point 1 from the list above, I make it dependent on the operation that will get me a token.

Now comes my confusion - how can I create an operation that uses a parameter from a previous operation, when I need to have both of them instantiated in order to make the one depend on the other?


Solution

  • Since I was not able to find a solution that will work for me, I ended up using PromiseKit, which allows me to chain asynchronous calls like this:

    [NSURLConnection promise:rq1].then(^(id data1){
        return [NSURLConnection promise:rq2];
    }).then(^(id data2){
        return [NSURLConnection promise:rq3];
    }).then(^(id data3){
        // Work with the data returned from rq3
    });