2009-08-17 3 views
9

Я довольно новичок в разработке iPhone и пытаюсь извлечь «Images from Server» в своем приложении.Получение изображения из URL/сервера

Я использую следующий метод, чтобы сделать это:

- (UIImage *)imageFromURLString:(NSString *)urlString 
{ 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request   
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    UIImage *resultImage = [UIImage imageWithData:(NSData *)result]; 

    NSLog(@"urlString: %@",urlString); 
    return resultImage; 
} 

Эта функция не возвращает ожидаемый образ, хотя я могу видеть в отладчик, который NSData для объекта Image имеет некоторое значение (в байтах)

Хотя очень похожая функция для получения текста с сервера работает, и я получаю ожидаемые значения.

- (NSString *)jsonFromURLString:(NSString *)urlString 
{ 

    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request 
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    NSString *resultString = [[NSString alloc] initWithData:result 
    encoding:NSUTF8StringEncoding]; 

    return [resultString autorelease]; 
} 

Этот метод работает нормально.

Может кто-то, пожалуйста, помогите мне понять, почему я не получаю изображение с сервера?

Благодаря

ответ

1

Наиболее вероятной причиной является то, что вы на самом деле не извлечение изображения, или вы извлечения изображения, iPhone не может декодировать. Я бы начал с проверки типа MIME результата ([response MIMEType]) и убедитесь, что это то, что вы ожидаете, а не, например, строка. Затем убедитесь, что ваш тип один из типов UIImage может обрабатывать: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

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

Когда вы передаете NSData без изображения в сообщение + imageWithData, вы получите нуль. Вероятно, вы должны это проверить.

29

Если все, что вы пытаетесь сделать, это захватить изображение с веб-сервера по URL-адресу, это более простой способ.

Это то, что я использую:

UIImage* myImage = [UIImage imageWithData: 
    [NSData dataWithContentsOfURL: 
    [NSURL URLWithString: @"http://example.com/image.jpg"]]]; 

И если вы хотите использовать его на взгляд изображения просто сделать следующее:

// Let's assume the picture is an instantiated UIImageView 
[picture setImage: myImage]; 
[myImage release]; 

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

+1

Пока вы поместите его в отдельном потоке, чтобы интерфейс не запирать , – Domness

+0

Почему вы освобождаете myImage? Вы его не выделили –

1

Это, вероятно, не имеет прямого отношения к вашему вопросу, но я хотел бы указать, что ваша проверка ошибок здесь имеет потенциальную проблему. Такие методы, которые имеют ссылочный параметр для NSError, обычно не определяют, что они возвращают при успехе. Другими словами, вы должны проверить эти методы возвращают значение первого и только доступ указатель ошибки, если метод не удалось:

NSString *resultString = nil; 
NSData *result = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
                error:&error]; 
[request release]; 

if(result) { 
    resultString = [[NSString alloc] initWithData:result 
             encoding:NSUTF8StringEncoding]; 
} 
else { 
    [self handleError:error]; 
}