我对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];
}
此方法正常。
有人可以帮我理解为什么我没有从服务器上获取图片吗?
由于
答案 0 :(得分:29)
如果您要做的只是通过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];
我确信有一个人可能不想使用这种方法的原因,但我会从这开始,看看它是否能满足您的需求。
答案 1 :(得分:2)
我编写了RemoteImage类来异步加载网络上的图像。它还可以在必要时释放内存。请参阅此帖子:http://www.dimzzy.com/blog/2009/11/remote-image-for-iphone/
答案 2 :(得分:1)
最可能的原因是您实际上并未获取图像,或者您正在获取iPhone无法解码的图像。我首先检查结果的MIME类型([response MIMEType]
),并确保它是你所期望的,而不是实际上是一个字符串。然后确保您的类型是UIImage可以处理的类型之一:tiff,jpeg,gif,png,bmp,ico,cur,xbm。
答案 3 :(得分:1)
很可能你的服务器返回的内容实际上并不是图像数据,你可以将网址粘贴到浏览器中,看看你是否获得了图像。除了缺少错误检查之外,代码似乎没有任何问题。
当您将非图像NSData传递到+ imageWithData消息时,您将获得nil。你应该检查一下。
答案 4 :(得分: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];
}