9

我对 iPhone 开发相当陌生,并试图在我的应用程序中获取“来自服务器的图像”。

我正在使用以下方法来执行此操作:

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

尽管我可以在调试器中看到 Image 对象的 NSData 具有某些值(以字节为单位),但此函数不会返回预期的图像

虽然,从服务器获取文本的功能非常相似,但我得到了预期值。

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

这种方法效果很好。

有人可以帮我理解为什么我没有从服务器获取图像吗?

谢谢

4

5 回答 5

28

如果您要做的只是通过 URL 从 Web 服务器获取图像,那么还有一种更简单的方法。

这就是我使用的:

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

我确信一个人可能不想使用这种方法是有原因的,但我会从这个开始,看看它是否会做你需要的事情。

于 2009-11-05T23:25:10.317 回答
2

我编写了 RemoteImage 类来通过网络异步加载图像。它还负责在必要时释放内存。看到这篇文章:http ://www.dimzzy.com/blog/2009/11/remote-image-for-iphone/

于 2009-11-05T14:16:45.350 回答
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];
}
于 2009-11-05T23:36:07.570 回答
1

最可能的原因是您实际上并未获取图像,或者您正在获取 iPhone 无法解码的图像。我将首先检查结果 ( [response MIMEType]) 的 MIME 类型,并确保它是您所期望的,而不是例如实际上是字符串。然后确保你的类型是UIImage可以处理的类型之一:tiff、jpeg、gif、png、bmp、ico、cur、xbm。

于 2009-08-17T04:18:18.310 回答
1

很可能您的服务器返回的实际上不是图像数据,您只需将 url 粘贴到浏览器中,看看是否获得了图像。除了缺少错误检查之外,代码似乎没有任何问题。

当您将非图像 NSData 传递给 +imageWithData 消息时,您将得到 nil。你可能应该检查一下。

于 2009-08-17T04:20:54.313 回答