Domanda

Sono sempre un'immagine su HTTP, utilizzando NSURLConnection, come segue -

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];
}

Di solito funziona bene, ma a volte mi sto vedendo questo ottenere registrato -: dati corrotti JPEG: fine prematura del segmento dati

A questo punto, l'immagine non completamente il rendering. Vedrò forse il 75% di esso, e quindi l'angolo in basso a destra è una scatola grigia.

Tutte le idee su come avvicinarsi risoluzione di questo? Sto costruendo la mia immagine in modo improprio?

È stato utile?

Soluzione

Il tuo codice HTTP sembra corretto. Si potrebbe desiderare di registrare le dimensioni del receivedData una volta che è fatto carico e confrontarlo con la dimensione prevista dell'immagine sul server. Se è la dimensione prevista, allora forse l'immagine stessa è danneggiato sul server.

Altri suggerimenti

ASI-HTTP può risolvere questo 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];

La mia variabile coda nel AppDelegate è ASINetwork oggetto di coda. Perché io mando richiesta asincrona, quindi lo uso.

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

ho risolto questo problema utilizzando un NSMutableDictionary.

NSMutableDictionary *dataDictionary;

Nella mia funzione loadData, definisco miei dati:

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

Poi ho caricare i dati nel mio dizionario, dove la chiave è [descrizione theConnection] e l'oggetto è i miei dati.

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

In questo modo nei delegati, posso cercare l'oggetto di dati corretti per la connessione che viene passato al delegato e salvare l'istanza di dati a destra altrimenti io alla fine con il formato JPEG munging / problema della corruzione.

In didReceiveData, ho messo:

//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];

Allo stesso modo, in didReceiveResponse, ho messo:

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

E in connectionDidFinishLoading:     NSMutableData * theReceivedData = [dataDictionary objectForKey: [descrizione del collegamento]];     img = [[UIImage alloc] initWithData: theReceivedData];

E questo sembra funzionare molto bene. A proposito, il mio codice si basa su Apple tutorial per NSURLConnection con l'aggiunta di un NSMutableDictionary per tenere traccia delle singole connessioni. Spero che questo possa essere d'aiuto. Fammi sapere se vuoi che io inserisco la mia piena codice di gestione delle immagini.

Ho visto questo anche. Se si salvano i dati in un file e poi leggere i dati di nuovo in un'immagine, funziona perfettamente. Ho il sospetto che ci sia informazioni di intestazione http nei dati di immagine JPEG.

La speranza qualcuno trova una soluzione a questo, perché il salvataggio su file soluzione fa schifo.

// problem

UIImage *newImage = [UIImage imageWithData:receivedData];

// crappy workaround

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

Copia il contenuto NSData utilizzando receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length] può essere utile anche (ed è più efficiente di salvataggio e la lettura dal disco).

Una possibile ragione di questo è che l'oggetto receivedData originale non mantiene il suo contenuto (ad esempio quando creati utilizzando [NSData dataWithBytesNoCopy:length:]) e si tenta di leggerli dopo che sono stati liberati.

Questa è probabile quando si verifica questo problema su un altro thread dal thread che ha creato l'oggetto NSData.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top