0

Я проникаю мой устаревший iOS9 код в iOS10, в частности, это:Загрузка изображения теперь работает с 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; 
     } 
    } 

Это осуждается, но надежный код работает отлично. Когда я пытаюсь сделать приспособление для iOS10 + переменная изображения всегда инициализируется как нуль, и мои imageViews выглядеть пустым:

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, запрос появляется, чтобы прибыть нормально:

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

Изображение всегда будет нулевым, несмотря на то, что всегда имеет ненулевой размер байта, и с или без этой причудливой кодировки Base64 ... он всегда терпит неудачу. Я даже попробовал запустить код в основном потоке. Любые идеи почему?

+0

у вас возникла проблема –

+0

Nope @EmelElias У меня больше нет времени тратить на это, поэтому я использовал ваш синхронный вызов, потому что я хочу загрузить только 5 значков. Не лучшее решение, но мне не хватает времени. – Josh

ответ

0

Хорошая отправная точка будет проверять синхронный вызов работает т.е.

NSData * imgData = [[NSData Alloc] initWithContentsOfURL: URL]; UIImage * image = [UIImage imageWithData: imgData];

Если у вас нет данных, то с вашим запросом что-то не так.

+0

Привет, ваша синхронная идея работает. Что-то странное происходит внутри моей NSURLSessionTask. – Josh

+0

Можете ли вы сделать то же самое с NSURLSessionDownloadTask, просто попробуйте. –

Смежные вопросы