Frage

Ich bin ein Bild über HTTP bekommen, mit NSURLConnection, wie folgt -

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

In der Regel funktioniert es ganz gut, aber manchmal bin zu sehen bekommt ich diese angemeldet -: Corrupt JPEG-Daten: vorzeitiges Ende des Datensegmentes

An diesem Punkt wird das Bild nicht vollständig übertragen. Ich werde vielleicht 75% davon sehen, und dann die untere rechte Ecke ist ein graues Feld.

Alle Ideen, wie diese Fixierung zu nähern? Bin ich mein Bild konstruieren falsch?

War es hilfreich?

Lösung

Ihr HTTP-Code sieht richtig. Vielleicht möchten Sie die Größe des receivedData loggt sein, wenn es fertig ist geladen und es zu der erwarteten Größe des Bildes auf dem Server zu vergleichen. Wenn es die erwartete Größe ist, dann vielleicht das Bild selbst auf dem Server beschädigt ist.

Andere Tipps

ASI-HTTP kann dieses Problem beheben.

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

Meine Warteschlange Variable in AppDelegate ist ASINetwork Warteschlangenobjekt. Weil ich asynchrone Anforderung senden, so benutze ich es.

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

Ich reparierte dieses Problem durch eine NSMutableDictionary verwenden.

NSMutableDictionary *dataDictionary;

In meiner Funktion loaddata definiere ich meine Daten:

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

Dann lade ich die Daten in meinem Wörterbuch, wo der Schlüssel [theConnection Beschreibung] ist und das Objekt meiner Daten.

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

Auf diese Weise in den Delegierten, kann ich das richtige Datenobjekt für die Verbindung suchen, die an die Delegaten übergeben wird und auf die rechte Seite Dateninstanz speichere ich sonst mit dem JPEG-munging / Korruption Problem enden.

In didReceiveData, setze ich:

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

Auch in didReceiveResponse, setze ich:

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

Und in connectionDidFinishLoading:     NSMutableData * theReceivedData = [Datadictionary objectForKey: [Verbindungsbeschreibung]];     img = [[UIImage alloc] initWithData: theReceivedData];

Und das scheint sehr gut zu funktionieren. By the way, ist mein Code basiert auf Apples Tutorial für NSURLConnection mit dem Zusatz einer NSMutableDictionary Spur einzelner Verbindungen zu halten. Ich hoffe das hilft. Lassen Sie uns wissen, wenn Sie wollen, dass ich meinen vollen Bildverarbeitungscode schreiben.

Das habe ich auch gesehen. Wenn Sie die Daten in einer Datei speichern und dann die Daten zurück in ein Bild lesen, es funktioniert perfekt. Ich vermute, es gibt http-Header-Informationen in JPEG-Bilddaten.

Hope jemand eine Lösung für dieses Problem findet, weil die Abhilfe saugt Datei speichern.

// problem

UIImage *newImage = [UIImage imageWithData:receivedData];

// crappy workaround

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

Kopieren des NSData Inhalts receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length] Verwendung kann hilfreich sein zu (und es ist effizienter als zu speichern und von der Platte zu lesen).

Ein möglicher Grund dafür ist, dass das ursprüngliche receivedData Objekt behält nicht ihren Inhalt (zum Beispiel bei der Verwendung von [NSData dataWithBytesNoCopy:length:] erstellt) und Sie versuchen, sie zu lesen, nachdem sie freigegeben werden.

Dies ist wahrscheinlich, wenn Sie dieses Problem aus dem Thread auf einen anderen Thread auftreten, die das NSData Objekt erstellt hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top