Pregunta

Me estoy poniendo una imagen a través de HTTP, utilizando NSURLConnection, como sigue -

NSMutableData *receivedData;

- (void)getImage {
    self.receivedData = [[NSMutableData alloc] init];
    NSURLConnection *theConnection = // create connection
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    
   [receivedData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
   [connection release];

   UIImage *theImage = [UIImage imageWithData:receivedData];
}

Por lo general, funciona bien, pero a veces estoy viendo esta sesión :Corruptos JPEG datos:finalización prematura del segmento de datos

En este punto, la imagen no se procesan completamente.Voy a ver tal vez el 75% de la misma, y luego la esquina inferior derecha es un cuadro gris.

Cualquier idea sobre cómo acercarse a la fijación de este?Estoy construyendo mi imagen incorrectamente?

¿Fue útil?

Solución

Su código HTTP es correcta. Es posible que desee registrar el tamaño del receivedData una vez que se haya cargado y compararlo con el tamaño esperado de la imagen en el servidor. Si es el tamaño esperado, entonces tal vez la propia imagen está dañado en el servidor.

Otros consejos

ASI-HTTP puede solucionar este problema.

NSURL *coverRequestUrl = [NSURL URLWithString:imageStringURL];
ASIHTTPRequest *coverRequest = [[ASIHTTPRequest alloc] initWithURL:coverRequestUrl];
[coverRequest setDelegate:self];
[coverRequest setDidFinishSelector:@selector(imageRecieved:)];

[appDelegate.queue addOperation:coverRequest];
[appDelegate.queue go];

Mi variable de cola en AppDelegate es ASINetwork objeto de cola. Debido a que envío solicitud asincrónica, por lo que lo uso.

- (void)imageRecieved:(ASIHTTPRequest *)response
{
    UIImage *myImage = [UIImage imageWithData:[response responseData]];
}

Me fijo este problema utilizando un NSMutableDictionary.

NSMutableDictionary *dataDictionary;

En mi función loadData, defino mis datos:

NSMutableData *receivedData = receivedData = [[NSMutableData alloc] init];

Entonces me carga los datos en mi diccionario donde la clave es [Descripción theConnection] y el objeto es mis datos.

[dataDictionary setObject:receivedData forKey:[theConnection description]];

De este modo, en los delegados, se puede buscar el objeto de datos correcta para la conexión que se pasa al delegado y guardar en la instancia de datos correcta de lo contrario termino con el / JPEG problema munging corrupción.

En didReceiveData, puse:

//get the object for the connection that has been passed to connectionDidRecieveData and that object will be the data variable for that instance of the connection.
NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]];

//then act on that data
[theReceivedData appendData:data];

Del mismo modo, en didReceiveResponse, puse:

NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]];
[theReceivedData setLength:0];

Y en connectionDidFinishLoading:     NSMutableData * theReceivedData = [DataDictionary objectForKey: [descripción de la conexión]];     img = [[UIImage alloc] initWithData: theReceivedData];

Y esto parece funcionar muy bien. Por cierto, mi código se basa en Apple tutorial para NSURLConnection con la adición de un NSMutableDictionary para realizar un seguimiento de las conexiones individuales. Espero que esto ayude. Déjeme saber si usted quiere que yo puesto mi código de manejo de imagen completa.

He visto esto también. Si guarda los datos en un archivo y luego leer los datos de nuevo en una imagen, funciona perfectamente. Sospecho que hay información de la cabecera HTTP en los datos de imagen JPEG.

La esperanza alguien encuentra una solución a esto porque el guardar en el archivo solución chupa.

// problem

UIImage *newImage = [UIImage imageWithData:receivedData];

// crappy workaround

[receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO];
UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];

Copia el contenido NSData utilizando receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length] puede ser útil también (y es más eficiente que el ahorro y leer desde el disco).

Una posible razón de esto es que el objeto original, receivedData no retiene su contenido (por ejemplo, cuando se crean usando [NSData dataWithBytesNoCopy:length:]) y se intenta leerlos después de ser liberados.

Esto es probablemente cuando se encuentra con este problema en otro hilo del subproceso que creó el objeto NSData.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top