NSOperation Queue que se comporta anormalmente

Tengo la tarea de upload varias imágenes al server una por una. Entonces estoy usando el process de operación por lotes para esto. Cada vez que comienzo el process de carga, algunas operaciones, especialmente la primera, se completan tan pronto como se inicia y la image no se carga, y luego el process de actualización de lotes continúa bien con una falla rara de falta de otras imágenes.

El código que estoy usando es el siguiente:

-(void)callWSToUploadRxs{ NSLog(@"the total assets maintained are %lu", (unsigned long)_arr_assetsMaintained.count); NSMutableArray *mutableOperations = [NSMutableArray array]; int imageUploadCount = (int)[self extractFullSizeImagesToUpload].count; // second for loop is to initialize the operations and then queue them. for (int i = 0; i<imageUploadCount; i++) { NSData *imageData = UIImageJPEGRepresentation([_arr_originalImagesToSend objectAtIndex:i],1.0); NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPMethod:@"POST"]; NSLog(@"the url constructed is %@", [NSString stringWithFormat:@"%@/%@/%@/%@",uploadRxUrl,@"4004DD85-1421-4992-A811-8E2F3B2E49F7",@"5293",[_arr_imageNames objectAtIndex:i]]); [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@/%@/%@.jpg",uploadRxUrl,@"4004DD85-1421-4992-A811-8E2F3B2E49F7",@"5293",[_arr_imageNames objectAtIndex:i]]]]; [request setValue:@"binary/octet-stream" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:imageData]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [mutableOperations addObject:operation]; } currentUploadIndex++; NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); NSIndexPath * indexOfImageTobeDeleted = [_selectedItemsIndexPaths objectAtIndex:0];//numberOfFinishedOperations-1 [_arr_assetsMaintained removeObjectAtIndex:indexOfImageTobeDeleted.item]; [_arr_images removeObjectAtIndex:indexOfImageTobeDeleted.item]; [_arr_fullSizeImages removeObjectAtIndex:indexOfImageTobeDeleted.item]; [_arr_imageNames removeObjectAtIndex:indexOfImageTobeDeleted.item]; if ( [_arr_selectedCells containsObject:[NSString stringWithFormat:@"%ld",(long)indexOfImageTobeDeleted.item]] ) { [_arr_selectedCells removeObject:[NSString stringWithFormat:@"%ld",(long)indexOfImageTobeDeleted.item]]; //[cell.img_selctedRxs setHidden:TRUE]; } countBeforeClearingAssets = countBeforeClearingAssets - 1; //Reload the items of UICollectionView performBatchUpdates Block [_albumImagesCollection performBatchUpdates:^{ [_albumImagesCollection deleteItemsAtIndexPaths:@[indexOfImageTobeDeleted]]; } completion:nil]; _selectedItemsIndexPaths = [_albumImagesCollection indexPathsForSelectedItems]; // [_selectedItemsIndexPaths removeObjectAtIndex:0]; NSLog(@"the count of selected items after updation is %lu", (unsigned long)_selectedItemsIndexPaths.count); } completionBlock:^(NSArray *operations) { NSLog(@"All operations in batch complete"); [self callWSToAddNoteForRxs]; [_arr_originalImagesToSend removeAllObjects]; [_arr_selectedCells removeAllObjects]; currentUploadIndex = 0; NSLog(@"the array of image names is %@",_arr_imageNames); }]; [[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; // third is to maintain the progress block for each image to be uploaded one after the other. for (AFHTTPRequestOperation *operation in mutableOperations){ [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { [_progressOverLayView setAlpha:0.7f]; [_progressView setHidden:FALSE]; [_progressView setProgress: totalBytesWritten*1.0f / totalBytesExpectedToWrite animated: YES]; [_lbl_progressUpdate setHidden:FALSE]; _lbl_progressUpdate.text = [NSString stringWithFormat:@"Image %d of %lu uploading", currentUploadIndex, mutableOperations.count]; NSLog(@"Sent %lld of %lld bytes and progress is %f", totalBytesWritten, totalBytesExpectedToWrite, totalBytesWritten*1.0f / totalBytesExpectedToWrite); if(totalBytesWritten >= totalBytesExpectedToWrite) { //progressView.hidden = YES; [self setComplete]; } }]; } } 

En este código, la primera operación se ejecuta tan pronto empiezo a upload las imágenes, es decir, solo 3 de cada 4 se suben. Una image siempre se omite. También. si solo tengo Imagen en la cuadrícula, se carga con éxito.

Gracias.

Algunos pensamientos …

1) el bloque de actualización de progreso. Esto no le dice qué operaciones completaron; solo el recuento de ellos, así que sospecho que podrían no estar completando en el order en que el código cree que son todo el time …

2) el bloque de finalización toma un set de operaciones … Me pregunto si esto se llamará una vez con todas las operaciones, o varias veces con arreglos de las operaciones que completaron? Puede ver la longitud de la matriz para ver. Si recibe llamados para subsets de operaciones, este sería el lugar para eliminar los activos que ya se han cargado y hacer el trabajo de limpieza, ya que sabe qué operaciones finalizaron.

3) Configuraría el bloque de progreso de carga antes de agregar las operaciones a la queue; solo por security

4) No pude encontrar documentation para el método batchOperation, y me pregunté si se había eliminado de una versión más reciente de AFNetworking, y si es así, ¿quizás sea una buena API o no? Estaría tentado de crear mis propias operaciones en un ciclo para mayor claridad; y luego haga un poco de gestión del estado para verificar el estado del lote y manejarlo de manera adecuada.

5) Dices que una image siempre se omite … ¿es estable, siempre el primero o el último? ¿Se comporta de la misma manera en el sim vs en una networking celular o simula una connection lenta / no confiable?