Вопрос по iphone – iPhone - поврежденные данные JPEG для изображения, полученного по HTTP

7

Я получаю изображение через HTTP, используя NSURLConnection, следующим образом:

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

Обычно это работает просто отлично, но иногда я вижу, что это регистрируется -: поврежденные данные JPEG: преждевременный конец сегмента данных

На этом этапе изображение не полностью отображается. Я могу видеть, возможно, 75% этого, и тогда правый нижний угол - серая коробка.

Любые идеи о том, как подойти к решению этой проблемы? Я неправильно строю свой имидж?

Пожалуйста, проверьте ваши интернет-соединения. Abhishek Bedi
Я загружал много изображений и еще не видел этого. Вы изображение очень большое? Это происходит на других устройствах (компьютер, симулятор)? Corey Floyd
Он не очень большой, нет. И я вижу это как на iPhone, так и на симуляторе (но не при нажатии на изображение через веб-браузер). bpapa

Ваш Ответ

5   ответов
0

receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length] также может быть полезным (и это более эффективно, чем сохранение и чтение с диска).

Возможная причина этого заключается в том, что исходный объект receiveData не сохраняет свое содержимое (например, при создании с использованием[NSData dataWithBytesNoCopy:length:]) и вы пытаетесь прочитать их после освобождения.

Это вероятно, когда вы сталкиваетесь с этой проблемой в другом потоке из потока, который создалNSData объект.

9

вы захотите зарегистрировать размер полученных данных после завершения загрузки и сравнить их с ожидаемым размером изображения на сервере. Если это ожидаемый размер, то, возможно, само изображение повреждено на сервере.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded bpapa
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

а затем считываете данные обратно в изображение, это работает отлично. Я подозреваю, что в данных изображения JPEG есть информация заголовка http.

Надеюсь, что кто-то найдет решение этой проблемы, потому что обходной путь сохранения в файл - отстой.

// problem

UIImage *newImage = [UIImage imageWithData:receivedData];

// crappy workaround

[receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO];
UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];
Error: User Rate Limit Exceeded
3

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

Моя переменная очереди в appDelegate - объект очереди ASINetwork. Потому что я отправляю асинхронный запрос, поэтому я его использую.

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

NSMutableDictionary *dataDictionary;

В моей функции loadData я определяю свои данные:

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

Затем я загружаю данные в свой словарь, ключом которого является [описание соединения], а объектом являются мои данные.

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

Таким образом, в делегатах я могу найти правильный объект данных для соединения, которое передается делегату, и сохранить его в нужном экземпляре данных, в противном случае у меня возникнет проблема с повреждением / повреждением JPEG.

В didReceiveData я положил:

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

Точно так же в didReceiveResponse я положил:

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

И в связи с DidFinishLoading:     NSMutableData * theReceivedData = [dataDictionary objectForKey: [описание соединения]];     img = [[UIImage alloc] initWithData: theReceivedData];

И это, кажется, работает очень хорошо. Кстати, мой код основан наУчебник Apple по NSUrlConnection с добавлением NSMutableDictionary для отслеживания отдельных соединений. Надеюсь, это поможет. Дайте мне знать, если вы хотите, чтобы я опубликовал полный код обработки изображений.

Error: User Rate Limit Exceeded

Похожие вопросы