Je reçois une image sur http, à l'aide de NsurlConnection, comme suit -
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]; }
5 Réponses :
Votre code HTTP a l'air correct. Vous voudrez peut-être enregistrer la taille de la réceptionData une fois que cela a fait le chargement et la comparer à la taille attendue de l'image sur le serveur. Si c'est la taille attendue, alors peut-être que l'image elle-même est corrompue sur le serveur. P>
Merci, cela a beaucoup aidé beaucoup. En faisant cela, j'ai réalisé que c'était ma propre erreur de programmation (je fusionné accidentellement la demande deux fois).
Je faisais la même chose que BPAPA. Il semble que vous lanciez 2 nsurlConnections différentes sur la même URL, le résultat final sera corrompu des données.
J'ai exactement le même problème, et c'était vraiment à partir de la même cause: 2 connexions à la même image.
L'erreur est créée car les deux connexions partageent la même source de données. Lorsque vous construisez des applications dans lesquelles des tâches spécifiques doivent tirer simultanément (que vous avez faites par inadvertance, il semble :)), vous devez avoir une source de données unique pour chaque connexion (un à un) ou créer un sémaphore pour que vos données mutables soient nécessaires. La source n'est pas sérialisée avec les résultats de plusieurs connexions à la fois (conditions de course). Le résultat final est la création de données corrompues ou incomplètes! (Que vous avez vécu).
@bpapa - où exactement dans votre code étiez-vous en train de tirer la demande deux fois? Basé sur ma sortie de journal, je pense que je fais de même, mais je ne comprends pas pourquoi seules certaines photos seraient appelées deux fois.
Je n'ai plus accès à ce code, mais je pense que c'était juste que je fais des erreurs étranges en tant que développeur iOS inexpérimenté en 09. :)
Je l'ai vu aussi. Si vous enregistrez les données dans un fichier, puis lisez les données dans une image, cela fonctionne parfaitement. Je soupçonne qu'il y a des informations d'en-tête HTTP dans les données d'image JPEG.
J'espère que quelqu'un trouve une solution à cela car la solution de contournement de fichier Sauvegarde est suce. P>
// problem UIImage *newImage = [UIImage imageWithData:receivedData]; // crappy workaround [receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO]; UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];
Essayé et ça ne change rien
ASI-HTTP peut résoudre ce problème.
- (void)imageRecieved:(ASIHTTPRequest *)response { UIImage *myImage = [UIImage imageWithData:[response responseData]]; }
J'ai corrigé ce problème en utilisant un nsmutmédictionnel.
NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]]; [theReceivedData setLength:0];
J'utilise la même méthode. Fonctionne très bien. Assurez-vous qu'Alloc et init l'objet de données dans le dictionnaire avant d'envoyer la demande cependant. Sinon, vous finirez avec la même erreur
Copier le contenu Nsdata à l'aide de Une raison éventuelle de ceci est que l'objet original reçusData ne conserve pas son contenu (par exemple, lors de la création de Ceci est probable lorsque vous rencontrez ce problème sur un autre thread du fil qui a créé l'objet reçusData = [nsdata DatawithBytes: reçusData.bytes Longueur: reçusData.length] code> peut être utile également (et il est plus efficace que d'économiser et de lire à partir du disque). < / p>
[nsdata DatawithBytesnocopy: longueur:] code>) et que vous essayez de les lire après leur libération. p>
nsdata code>. p>
J'ai téléchargé de nombreuses images et je n'ai pas encore vu cela. Est-ce que tu es image extrêmement grande? Est-ce que cela se produit sur d'autres périphériques (ordinateur, simulateur)?
Ce n'est pas particulièrement grand, non. Et je le vois sur l'iPhone et le simulateur (mais pas en frappant l'image via un navigateur Web).
Veuillez vérifier également vos connexions Internet.