Сбой iPhone UIImage initWithData - PullRequest
       0

Сбой iPhone UIImage initWithData

2 голосов
/ 21 апреля 2010

Я пытаюсь закодировать загрузчик асинхронных изображений. Я использую NSURLConnection, чтобы получить данные в NSMutableData и использую эти данные после завершения инициализации UIImage.

Я проверил байты, и он корректно загружает все изображение (как минимум, нужное количество байтов); когда я звоню

[UIImage imageWithData:data]

, а затем проверьте свойства изображения, это нулевая ширина и число мусора для высоты, фактически одно и то же число, независимо от того, какое изображение. Я пытался с кучей разных изображений, PNG, JPG, разные URL, он всегда загружает изображение полностью, но UIImage не может инициализировать с этими данными. Что я могу здесь делать не так?

Спасибо.

Код действительно такой, как вы ожидаете, он будет выглядеть так:

Делегат соединения:

-(void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
[[ImageManager sharedInstance] dataDownloadedBy:self]; }

ImageManager:

-(void)dataDownloadedBy:(WebConnection *)connection{    
WebImage *image = [[WebImage alloc] initWithLink:connection.url];
[image setImageFromData:connection.data];
[images addObject:image];
[connection release];}

WebImage:

-(void)setImageFromData:(NSMutableData *)data{
image = [[UIImage alloc] initWithData:data];}

Ответы [ 4 ]

2 голосов
/ 22 апреля 2010

Во-первых, я уверен, что UIImage не будет инициализироваться с данными мусора. Конструктор initWithData анализирует данные, чтобы определить формат файла. Если ваши данные повреждены, возвращаемое изображение будет ноль. Сначала проверьте это.

-(void)dataDownloadedBy:(WebConnection *)connection{    
    WebImage *image = [[WebImage alloc] initWithLink:connection.url];
    [image setImageFromData:connection.data];
    if (image.image != nil) { [images addObject:image]; }
    [connection release];
}

Во-вторых, убедитесь, что вы добавляете данные во время процесса загрузки. Вот метод обратного вызова:

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.receivedData appendData:data];
}

Наконец, ваш код должен обязательно включать второй случай: сбой загрузки.

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [connection release];
}

В описании вашей проблемы отсутствуют некоторые важные фрагменты кода.

Демонстрация URLCache от Apple - очень хороший проект для понимания асинхронной загрузки изображений. http://developer.apple.com/iphone/library/samplecode/URLCache/Introduction/Intro.html

Надеюсь, это поможет вам!

0 голосов
/ 31 августа 2012

другая проблема, но та же самая болезненная ошибка возникает в том случае, если вы запрашиваете недоступный файл: HTTP-сервер вернет сообщение об ошибке 404, ваш код прочитает байты (они НЕ являются действительными байтами для изображения, И вы получите ноль.

0 голосов
/ 22 апреля 2010

Если initWithData терпит неудачу, скорее всего, данные изображения, которые вы получаете, повреждены. Вы должны сохранить его в файл, подобный следующему:

[data writeToFile:@"/tmp/foo.jpg" atomically:NO];

, а затем попробуйте открыть его в Preview.app.

0 голосов
/ 22 апреля 2010

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

Раньше я делал то же самое, вы можете посмотреть пост здесь http://blog.163.com/lionyue@126/blog/static/1079307120096895433277/

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...