2012-07-11 8 views
6

Estoy desarrollando una aplicación de mensajería, y los usuarios también pueden enviarse imágenes entre ellos.
Cuando un usuario envía más de una imagen les envío en paralelo (que no espere a que el primero en terminar de carga antes de enviar el segundo)Envío de más de una imagen con AFNetworking

Antes de pasar a AFNetworking que tuvieron éxito en hacer esto con ASIFormDataRequest y, de hecho, si envié 2 imágenes, ambas se transmitieron en paralelo y se entregaron con éxito al otro usuario.

Cuando intento hacer esto con AFNetworking, tengo un comportamiento extraño.
voy a tratar de describir el caso se enviará usuario1 usuario2 también dos imágenes:

  1. Usuario1 envía imagen1 -> todo se ve bien, puedo ver el progreso de la carga.
  2. Usuario1 continuación, enviar imagen2 -> todavía se ve bien, puedo ver el progreso de carga de ambas imágenes
  3. carga imagen1 está terminado -> usuario2 para crear una imagen dañada que se parece a una combinación de imagen1 imagen2 y juntos!
  4. carga imagen2 está terminado -> usuario2 obtiene imagen2 éxito

Ésta es la forma en que envío una imagen

- (void)sendImageMsgWithPath:(NSString *)path 
         image:(UIImage *)image 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 
        progress:(void (^)(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress 
{ 
    NSData *imageData = UIImageJPEGRepresentation(image, 0.5); 

    // create the request 

    NSURLRequest *request = [[AppClient sharedClient] multipartFormRequestWithMethod:@"POST" path:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
          { 
           [formData appendPartWithFileData:imageData name:@"image_name" fileName:@"image_name.jpg" mimeType:@"image/jpeg"]; 
          }]; 


    // create the operation 

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

    // set progress block 

    [operation setUploadProgressBlock:progress]; 

    //set completion blocks 

    [operation setCompletionBlockWithSuccess:success failure:failure]; 

    // set it to work in background 

    [operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:nil]; 

    // add it to the operations queue 

    [[AppClient sharedClient] enqueueHTTPRequestOperation:operation]; 
} 

*** el camino tanto para la subida de imágenes es el mismo:

path = @ "FrontEnd? Cmd = sendimage & fromuserid = 3 & touserid = 1 &"

que se añadirá a la URL base para crear la URL coplete:

@ "http://somename.myftp.org:8080/web_proj/FrontEnd?cmd=sendimage&fromuserid=3&touserid=1"

Esta son las imágenes que le envié:
imagen1
enter image description here

image2
enter image description here

imagen dañada
enter image description here

+0

asegúrese de utilizar búferes separados para cada imagen que envíe. También asegúrese de que su receptor esté utilizando memorias intermedias separadas para cada imagen recibida. Parece que se combinan en alguna parte. Finalmente, si está enviando/recibiendo más de 3G/4G, es posible que no obtenga una gran mejora de rendimiento al enviar todas las imágenes en paralelo. Deberá experimentar para ver cuántas secuencias son óptimas. – nielsbot

+0

Tengo éxito haciendo esto con la biblioteca ASIHTTPRequest así que probablemente no sea un problema del servidor. Acerca de los búferes en el lado del cliente, bueno, realmente no manejo esto, solo estoy usando la API de AFNetworking, no estoy seguro de si la biblioteca lo administra o si necesito hacerlo ... – Eyal

+0

¿Cómo maneja esto en el ¿lado del servidor? Tal vez está escribiendo las imágenes recibidas en el mismo archivo: la primera comienza a sobrescribirse por la segunda, la segunda se envía de manera correcta, porque ha sobrescrito la primera por completo. – yonosoytu

Respuesta

1

Utilice un multipartFormRequest para ese uso por debajo de método:

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method 
               path:(NSString *)path 
             parameters:(NSDictionary *)parameters 
          constructingBodyWithBlock:(void (^)(id <AFMultipartFormDataProxy>formData))block; 

Por ejemplo así:

NSURLRequest* request = [[YourHTTPClient sharedHTTPClient] multipartFormRequestWithMethod:@"POST" 
        path:path 
        parameters:dict 
        constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          [formData appendPartWithFileData:data1 
                 name:@"image1" 
                 fileName:@"image1.jpg" 
                 mimeType:@"image/jpeg"]; 
          [formData appendPartWithFileData:data2 
                 name:@"image2" 
                 fileName:@"image2.jpg" 
                 mimeType:@"image/jpeg"]; 
        } 
       }]; 
+0

Pero utilizo multipartFormRequestWithMethod, no deseo enviar dos imágenes en una solicitud, las imágenes se envían en dos solicitudes por separado ... – Eyal

1

Cómo estás creando los objetos UIImage que pasar a su método sendImageMsgWithPath:? ¿Los estás creando usando imageWithData: (o similar)? Si es así, he visto problemas como este al intentar reutilizar un NSMutableData. Parece que incluso después de crear el UIImage, el subsistema aún necesita leer esos datos en un momento posterior. Y si desde entonces reutilizó ese NSMutableData, la imagen se dañará.

Si este es el caso, le recomiendo que use un nuevo NSMutableData para crear cada UIImage.

+0

No, estoy obteniendo la imagen del UIImagePickerController ... – Eyal

Cuestiones relacionadas