AFNetworking 3.0 AFHTTPSessionManager utilizando NSOperation

Estoy atrapado ahora algún time y necesito ayuda. Así que en AFNetworking 2.0 tenemos AFHTTPRequestOperation por lo que podría usar fácilmente NSOperationQueue y tener algunas dependencies. Entonces, lo que tenemos ahora es solo AFHTTPSessionManager y NSURLSession que no subclass NSOperation . Tengo class APIClient que subclasss AFHTTPSessionManager . Estoy usando esa class como singleton como shanetworkingClient . He anulado GET y POST, por ejemplo, GET se ve así:

 - (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { NSURLSessionDataTask *task = [super GET:URLString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { success(task, responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(task, [Response createErrorWithAFNetworkingError:error]); }]; return task; } 

¿Tiene alguna idea de cómo implementar de esa manera (si es posible) para envolverlo como NSOperation ? Entonces, lo que quiero hacer: quiero poder ejecutar en paralelo dos llamadas de networking, y luego tener otra llamada de método que depende de la segunda llamada de networking de las dos primeras llamadas. ¿Tienes alguna idea de cuál sería el mejor enfoque?

He escrito un breve set de classs ( https://github.com/robertmryan/AFHTTPSessionOperation/ ) que envuelven AFHTTPSessionManager requestes AFHTTPSessionManager en NSOperation subclass de NSOperation asíncrona. A continuación, puede usar eso para disfrutar restricciones de operación maxConcurrentOperation , o dependencies de operación.

Por ejemplo, aquí hay un ejemplo en el que emitimos dos requestes simultáneas y que una operación de finalización depende de la finalización de ambas requestes:

 // ViewController.m #import "ViewController.h" #import "AFNetworking.h" #import "AFHTTPSessionOperation.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *urlString1 = @"..."; NSString *urlString2 = @"..."; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.name = @"AFHTTPSessionManager queue"; NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"All done"); }]; NSOperation *op1 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:urlString1 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 1"); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 1 - error = %@", error.localizedDescription); }]; [completionOperation addDependency:op1]; NSOperation *op2 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:urlString2 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 2"); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 2 - error = %@", error.localizedDescription); }]; [completionOperation addDependency:op2]; [queue addOperations:@[op1, op2] waitUntilFinished:false]; [[NSOperationQueue mainQueue] addOperation:completionOperation]; // do this on whatever queue you want, but often you're updating UI or model objects, in which case you'd use the main queue } @end 

Vale la pena señalar que, dado que solo está tratando con dos requestes, también podría usar los grupos de envío para lograr lo mismo:

 // ViewController.m #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *urlString1 = @"..."; NSString *urlString2 = @"..."; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); [manager GET:urlString1 parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"finished 1"); dispatch_group_leave(group); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failed 1 - error = %@", error.localizedDescription); dispatch_group_leave(group); }]; dispatch_group_enter(group); [manager GET:urlString2 parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"finished 2"); dispatch_group_leave(group); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failed 2 - error = %@", error.localizedDescription); dispatch_group_leave(group); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"All done"); }); } @end 

Con los grupos de despacho, solo debe tener cuidado de que cada ruta dentro de los bloques de success y failure llame a dispatch_group_leave .