0

J'émigre mon code iOS9 dépréciée à iOS10, plus précisément ceci:Téléchargement de l'image ne fonctionne maintenant avec NSURLSessionDataTask

@interface IconDownloader : NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>{ 
    NSMutableData *receivedData; 
} 
@property(nonatomic,strong)CapabilityType *capability; 
@property(nonatomic,strong)CapabilitiesItemView *item; 
-(void)downloadIcon:(CapabilityType *)capability forItem:(CapabilitiesItemView *)item; 
@end 

@implementation IconDownloader 
. 
. 
. 
. 
NSURLConnection *con=[[NSURLConnection alloc] initWithRequest:req delegate:self]; 
    [con start]; 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    NSLog(@"DEPRECATED - didReceiveData"); 
    if(!receivedData){ 
     receivedData=[[NSMutableData alloc] initWithData:data]; 
    }else 
     [receivedData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSLog(@"DEPRECATED - connectionDidFinishLoading"); 
    NSLog(@"NSURLConnection - COMPLETE, dataLength=%lu",(unsigned long)receivedData.length); 
    NSLog(@"DataIOS7+: %@",receivedData); 
    if(receivedData.length>0){ 
     UIImage *image=[UIImage imageWithData:receivedData]; 
     if(image){ 
      self.capability.icon=image; 
      self.item.iconImageView.image=image; 
     } 
    } 

Ce dépréciée, mais le code fiable fonctionne parfaitement. Lorsque je tente de faire une adaptation pour iOS10 +, la variable d'image est initialisé toujours comme nulle, et mes imageViews regard vide:

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req 
              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ 
             NSLog(@"NSURLSessionDataTask - COMPLETE, error=%@",error); 
             if(!error){ 
              NSLog(@"NSURLSessionDataTask - COMPLETE, dataLength=%lu",(unsigned long)data.length); 
              NSLog(@"DataIOS10: %@",data); 
              if(data.length>0){ 
               NSData *dataIOS10 = [[NSData alloc] initWithBase64EncodedString:[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
               UIImage *image=[UIImage imageWithData:dataIOS10]; 

               dispatch_async(dispatch_get_main_queue(), ^{ 
               if(image){ 
                NSLog(@"NSURLSessionDataTask - COMPLETE, IMAGE OK"); 
                self.capability.icon=image; 
                self.item.iconImageView.image=image; 
               } 
               else{ 
                NSLog(@"NSURLSessionDataTask - COMPLETE, IMAGE ERROR"); 
                self.capability.icon=image;//Lets try shoving that data there, just in case LOL 
                self.item.iconImageView.image=image; 
               } 
               }); 
              } 
             } 
            }]; 
[dataTask resume]; 

EXTRA, la demande semble arriver bien:

NSURLSessionDataTask - COMPLETE, response=<NSHTTPURLResponse: 0x15e450f0> { URL: https://abc.SOMESERVER.net/prod/wcid/iphone/icon_fun.png } { status code: 200, headers { 
    "Accept-Ranges" = bytes; 
    Connection = "keep-alive"; 
    "Content-Length" = 6416; 
    "Content-Type" = "image/png"; 
    Date = "Tue, 31 Jan 2017 13:11:05 GMT"; 
    Etag = "\"e554f6246076dc4eddf589f9552608b5\""; 
    "Last-Modified" = "Mon, 28 Apr 2014 13:30:15 GMT"; 
    Server = AmazonS3; 
    Via = "1.1 dc81da318a4ae20e51ccfd9463219596.cloudfront.net (CloudFront)"; 
    "X-Amz-Cf-Id" = "xlj4_3IUrjctZLrGlegXoZbrmTYqd_ahcGzG3K2glG3m6keedPk6mQ=="; 
    "X-Cache" = "Miss from cloudfront"; 
    "x-amz-meta-cb-modifiedtime" = "Thu, 31 Oct 2013 15:26:16 GMT"; 
} } 

L'image sera toujours nulle, bien qu'elle ait toujours une taille d'octet non nulle, et avec ou sans cet encodage Base64 ... elle échoue toujours. J'ai même essayé d'exécuter le code sur le fil principal. Des idées pourquoi?

+0

Avez-vous eu quel est le problème –

+0

Nope @EmelElias Je n'ai pas plus de temps à perdre à ce sujet, j'ai donc utilisé votre appel synchrone parce que je veux seulement charger 5 icônes. Pas la meilleure solution, mais je manque de temps. – Josh

Répondre

0

Bon point de départ serait de vérifier l'appel synchrone i.e. travaille

NSData * imgData = [[NSData alloc] initWithContentsOfURL: url]; UIImage * image = [UIImage imageWithData: imgData];

Si vous ne parvenez pas à générer des images, il y a un problème avec votre demande.

+0

Bonjour, votre idée synchrone fonctionne. Quelque chose de bizarre se passe dans mon NSURLSessionTask. – Josh

+0

pouvez-vous faire la même chose avec NSURLSessionDownloadTask suffit d'essayer. –