¿Cómo solicitar por lotes con AFNetworking 2?

Así que estoy reescribiendo una aplicación para iOS 7 con AFNetworking 2.0 y me estoy topando con el problema de enviar un lote de requestes a la vez y rastrear su progreso. En el antiguo AFNetworking había el enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock: método en AFHTTPClient , esto se refacciona claramente y estoy un poco confundido sobre cómo enqueuer múltiples requestes.

He creado una subclass de AFHTTPSessionManager y estoy usando los methods POST:... y GET:... para comunicarse con el server. Pero no puedo encontrar nada en el código y / o documentos para enqueuer múltiples requestes a la vez como con el antiguo AFHTTPClient .

Lo único que puedo encontrar es el batchOfRequestOperations:progressBlock:completionBlock: indocumentado batchOfRequestOperations:progressBlock:completionBlock: método en AFURLConnectionOperation , pero que se parece a la forma de iOS 6 de hacerlo.

Es evidente que me estoy perdiendo algo en el nuevo concepto NSURLSession que debería usar para enviar requestes por lotes o search en una nueva function AFNetworking. Espero que alguien pueda ayudarme en el path correcto aquí!

tl; dr: ¿Cómo puedo enviar un lote de requestes con mi subclass AFHTTPSessionManager ?

Gracias Sendoa por el enlace al tema GitHub donde Mattt explica por qué esta funcionalidad ya no funciona. Hay una razón clara por la que esto no es posible con la nueva estructura de NSURLSession ; Las tareas no son operaciones, por lo que la antigua forma de usar dependencies o lotes de operaciones no funcionará.

He creado esta solución utilizando un dispatch_group que permite realizar requestes por lotes utilizando NSURLSession , aquí está el código (pseudo-):

 // Create a dispatch group dispatch_group_t group = dispatch_group_create(); for (int i = 0; i < 10; i++) { // Enter the group for each request we create dispatch_group_enter(group); // Fire the request [self GET:@"endpoint.json" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // Leave the group as soon as the request succeeded dispatch_group_leave(group); } failure:^(NSURLSessionDataTask *task, NSError *error) { // Leave the group as soon as the request failed dispatch_group_leave(group); }]; } // Here we wait for all the requests to finish dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // Do whatever you need to do when all requests are finished }); 

Quiero mirar escribir algo que haga que esto sea más fácil de hacer y discutir con Matt si esto es algo (cuando se implementa bien) que podría fusionarse en AFNetworking. En mi opinión, sería genial hacer algo así con la biblioteca misma. Pero tengo que verificar cuándo tengo time libre para eso.

Simplemente actualizando el hilo … Tuve el mismo problema y después de algunas investigaciones encontré algunas buenas soluciones, pero decidí quedarme con esto:

Estoy usando el proyecto llamado Bolts . Entonces, para la misma muestra anterior publicada por @ Mac_Cain13, sería:

 [[BFTask taskWithResult:nil] continueWithBlock:^id(BFTask *task) { BFTask *task = [BFTask taskWithResult:nil]; for (int i = 0; i < 10; i++) { task = [task continueWithBlock:^id(BFTask *task) { return [self executeEndPointAsync]; }]; } return task; }] continueWithBlock:^id(BFTask *task) { // Everything was executed. return nil; }];; - (BFTask *) executeEndPointAsync { BFTaskCompletionSource *task = [BFTaskCompletionSource taskCompletionSource]; [self GET:@"endpoint.json" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { [task setResult:responseObject]; } failure:^(NSURLSessionDataTask *task, NSError *error) { [task setError:error]; }]; }]; return task.task; } 

Básicamente, está astackndo todas las tareas, esperando y desenvolviendo hasta que no haya más tareas, y después de que todo se complete, se ejecuta el último bloque de finalización.

Otro proyecto que hace lo mismo es RXPromise, pero para mí el código en Bolts fue más claro.

Para la request que se puede post u get , puede usar AFNetworking 2.0 para la operación por lotes ya que, en primer lugar, necesita crear una operación como esta:

 //Request 1 NSString *strURL = [NSString stringWithFormat:@"your url here"]; NSLog(@"scheduleurl : %@",strURL); NSDictionary *dictParameters = your parameters here NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:strURL parameters:dictParameters error: nil]; AFHTTPRequestOperation *operationOne = [[AFHTTPRequestOperation alloc] initWithRequest:request]; operationOne = [AFHTTPResponseSerializer serializer]; [operationOne setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //do something on completion } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@",[error description]); }]; //Request 2 NSString *strURL1 = [NSString stringWithFormat:@"your url here"]; NSLog(@"scheduleurl : %@",strURL); NSDictionary *dictParameters1 = your parameters here NSMutableURLRequest *request1 = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:strURL1 parameters:dictParameters1 error: nil]; AFHTTPRequestOperation *operationTwo = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; operationTwo = [AFHTTPResponseSerializer serializer]; [operationTwo setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //do something on completion } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@",[error description]); }]; //Request more here if any 

Ahora realiza la operación por lotes así:

 //Batch operation //Add all operation here NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[operationOne,operationTwo] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { NSLog(@"%i of %i complete",numberOfFinishedOperations,totalNumberOfOperations); //set progress here yourProgressView.progress = (float)numberOfFinishedOperations/(float)totalNumberOfOperations; } completionBlock:^(NSArray *operations) { NSLog(@"All operations in batch complete"); }]; [[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; 

En AFNetworking 2.0, AFHTTPClient se ha dividido en AFHTTPRequestOperationManager y AFHTTPSessionManager , por lo que probablemente podría comenzar con el primero, que tiene la propiedad operationQueue .

Actualmente, NSURLSession tareas NSURLSession no son adecuadas para el mismo tipo de patrones que las operaciones de request utilizan. Vea la respuesta de Mattt Thompson aquí sobre este tema.

Respuesta directa: si necesita dependencies o lotes, aún tendrá que usar las operaciones de request.